如何将向量数组传递到函数

How to pass an array of vectors to a function

本文关键字:函数 数组 向量      更新时间:2023-10-16

我已经定义了一个向量数组,并希望将此数组传递到一个函数。

这是我的代码:

void gridlist(std::vector<int> *grid, int rows, int cols){
    ..... }
int rows=4;
int cols=5;
std::vector<int> grid[rows][cols];
gridlist(grid,rows,cols);

唯一为我传递数组到函数的方法是通过指针(*)?

我根据以下描述尝试了不同的方法:将2D数组传递到C 函数,但我没有设法使其正常工作。

我总是会收到以下错误:

could not convert '(std::vector<int> (*)[cols])(& grid)' from 'std::vector<int> (*)[cols]' to 'std::vector<int>'
       gridlist(grid,rows, cols);

我不知道我在做什么错。通常,什么是完成该任务的最佳/最安全方法?

您可以使用模板:

template<int rows, int cols>
void gridlist(std::vector<int> (&grid)[rows][cols]){
}
int main()
{
const int rows=4;
const int cols=5;
std::vector<int> grid[rows][cols];
gridlist(grid);
}

您的代码还有其他更改,int rows=4;const int rows=4;这是因为VLA(可变长度阵列)在C 中是非标准的。如果要动态数组,请考虑使用向量的向量(whhooh)的向量:std::vector<std::vector<std::vector<int>>>

void gridlist(std::vector<int> *grid, int rows, int cols){
    ..... }
int rows=4;
int cols=5;
std::vector<int> grid[rows][cols];
gridlist(grid,rows,cols);

这里grind具有std::vector<int>[][]类型,而grindlist()期望std::vector<int> *。您必须要么必须使grindlist()期望std::vector<int>[] *,要么确保grindstd::vector<int>[]

我建议改用std::array<>

template<int rows, int cols>
void gridlist(std::array<std::array<std::vector<int>, cols>, rows>& grid) {
    ..... }
constexpr int rows = 4;
constexpr int cols = 5;
std::array<std::array<std::vector<int>, cols>, rows> grid;
gridlist(grid);

如果您需要两个维度的变量大小,则不能直接传递2D数组。

一种解决方案是修复cols的大小,并声明您的功能:

void gridlist1(std::vector<int> grid[][5],int rows){...}

如果修复一个维度的大小是不可接受的,则可以使用临时变量:

void gridlist(std::vector<int> **grid,int rows, int cols){...}

并将其称为:

const int rows=4;
const int cols=5;
std::vector<int> grid[rows][cols]; 
// Temp variable
std::vector<int>* temp[rows];
for (int i = 0; i < rows; ++i) temp[i] = grid[i];
gridlist(temp,rows,cols);
         ^^^^

但是,我将使用向量向量的向量而不是传统的C风格数组。