2016-06-16 7 views
-2

Я определил массив векторов и хочу передать этот массив функции.Как передать массив векторов функции

Вот мой код:

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

Я не знаю, что я делаю неправильно. Что, в общем, считается лучшим/безопасным методом для выполнения этой задачи?

+3

Использование вектора векторов или 'std :: array' векторов кажется хорошим. – MikeCAT

+1

Вы пробовали, как добрый двухзвездочный программист, используя std :: vector ** grid, или вы хотите, чтобы размеры массивов передавались как параметры типа? – lorro

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

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

+0

То, что я на самом деле сделал, чтобы продолжить работу, но мне нужен переменный размер, спасибо за обходной путь с переменной temp! –