c++ 如何将向量数组传递给函数

cvxl0en2  于 2023-02-06  发布在  其他
关注(0)|答案(3)|浏览(175)

我已经定义了一个向量数组,并希望将此数组传递给一个函数。
下面是我的代码:

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);

唯一一个能让我把数组传递给函数的方法是通过指针(*)?。
根据以下描述,我尝试了不同的方法:Passing a 2D array to a C++ function,但我没能让它工作。
我总是得到以下错误:

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

我不知道我做错了什么。一般来说,什么方法被认为是完成这项任务的最好/最安全的方法?

u1ehiz5o

u1ehiz5o1#

您可以使用模板:

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>>>

np8igboo

np8igboo2#

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>[] *,要么确保grind的类型为std::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);
ztmd8pv5

ztmd8pv53#

如果您希望两个维度的大小都可变,则不能直接传递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);
         ^^^^

但是,我将使用vector of vector of vector,而不是传统的c样式数组。

相关问题