我已定义了一个向量数组,并希望将此数组传递给函数。
这是我的代码:
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);
我不知道我做错了什么。通常,什么是最好/最安全的方法来完成这项任务?
答案 0 :(得分:0)
您可以使用模板:
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>>>
答案 1 :(得分:0)
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);
答案 2 :(得分:0)
如果您想要两个尺寸的可变尺寸,则无法直接传递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风格数组。