C ++: функция для работы с массивами разных размеров - PullRequest
1 голос
/ 10 октября 2011

У меня есть 2 2D массива, которые представляют лабиринт

const char maze1[10][11] и const char maze2[20][21]

Я пытаюсь создать 1 функцию для обработки обоих лабиринтов, например:

void solveMaze(maze[][])
{
}

и просто передайте лабиринт как solveMaze(maze1);
Однако я должен предоставить размер для массива, который отличается в зависимости от того, какой лабиринт передается. Без перегрузки функции или использования шаблонов функций,Как я могу иметь 1 функцию для обработки обоих массивов?

Ответы [ 3 ]

7 голосов
/ 10 октября 2011

C ++ ответ

Использование std::vector:

// Initialize the vector with 11 rows of 10 characters
std::vector<std::vector<char> > maze(11, std::vector<char>(10));

void solveMaze(const std::vector<std::vector<char> > &maze) {
    // note that you can access an element as maze[x][y]
}

boost::multi_array немного более эффективно (если выразрешено использовать буст).Я думаю, что это выглядит примерно так:

boost::multi_array<char, 2> maze(boost::extents[10][11]);

void solveMaze(const boost::multi_array<char, 2> &maze) {
    // note that you can access an element as maze[x][y]
}

C ответ

Используйте указатели:

const char maze1[10][11];

void solveMaze(char *maze, size_t x_length, size_t y_length) {
    // note that you can access an element as maze[x + (x_length * y)]
}
1 голос
/ 11 октября 2011

На самом деле это можно решить без вектора:

template<size_t N, size_t M>
void foo(char (&maze)[N][M])
{
    // do your stuff here
}

С другой стороны, я бы также предпочел использовать векторы: это просто кажется безопаснее.

1 голос
/ 10 октября 2011

Стандарт c ++ не позволяет использовать массивы переменного размера. Расширения Gnu позволяют это.

с учетом компилятора GNU, вы можете

 void solvemaze(int w, int h, const char maze[h][w])
 {    //solve it...
 }

в противном случае

 void solvemaze(int w, int h, const char *maze)
 {    //solve it, bearing in mind:
      //maze[y][x] = maze[(w*y)+x];
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...