Как мне работать с вложенными векторами в C ++? - PullRequest
5 голосов
/ 28 февраля 2010

Я пытаюсь работать с векторами векторов целых для решения головоломки Судоку, которое я пишу.

Вопрос 1:

Если я собираюсь получить доступ к своему 2-мерному вектору по индексу, я должен сначала инициализировать его с соответствующим размером?

Например:

typedef vector<vector<int> > array2d_t;

void readAPuzzle(array2d_t grid)
{
    for(int i = 0; i < 9; i++)
        for(int j = 0; j < 9; j++)
            cin >> grid[i][j];
    return;
}

int main()
{
    array2d_t grid;
    readAPuzzle(grid);
}

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

Я поменял строку объявления сетки на:

array2d_t grid(9, vector<int>(9, 0));

И это, кажется, избавляет от этой ошибки сегмента. Это правильный способ справиться с этим?

Вопрос 2:

Почему, когда я пытаюсь прочитать в своей сетке из cin, а затем распечатать сетку, сетка остается пустой?

Для этого я использую следующий код:

void printGrid(array2d_t grid)
{
    for (int i = 0; i < 9; i++)
    {
        for (int j = 0; j < 9; j++)
        {
            cout << grid[i][j] + " ";
        }
        cout << endl;
    }
}

void readAPuzzle(array2d_t grid)
{
    for(int i = 0; i < 9; i++)
        for(int j = 0; j < 9; j++)
            cin >> grid[i][j];

    return;
}

int main()
{
    array2d_t grid(9, vector<int>(9, 0));
    printGrid(grid);
    readAPuzzle(grid);
    printGrid(grid);
}

И я пытаюсь запустить мою программу, как:

./a.out < sudoku-test

Где sudoku-test - это файл, содержащий следующее:

3 0 0 0 0 0 0 0 0  
5 8 4 0 0 2 0 3 0  
0 6 0 8 3 0 0 7 5  
0 4 1 0 0 6 0 0 0  
7 9 0 0 2 0 0 5 1  
0 0 0 9 0 0 6 8 0  
9 3 0 0 1 5 0 4 0  
0 2 0 4 0 0 5 1 8  
0 0 0 0 0 0 0 0 6  

Первый вызов printGrid () дает пустую сетку, когда вместо этого я должен видеть сетку 9x9 с 0, поскольку именно так я ее инициализировал. Второй вызов должен содержать сетку выше. Однако оба раза оно пустое.

Может кто-нибудь пролить свет на это?

1 Ответ

5 голосов
/ 28 февраля 2010

Q1: Да, это правильный способ справиться с этим. Однако обратите внимание, что вложенные векторы являются довольно неэффективным способом реализации двумерного массива. Один вектор и вычисление индексов по x + y * width обычно являются лучшим вариантом.

Q2A: вычисление grid[i][j] + " " не объединяет две строки (потому что левая часть - это int, а не строка), но вместо этого добавляет числовое значение к указателю (адрес памяти первого символа строки "") , Вместо этого используйте cout << grid[i][j] << " ".

Q2B: Вы передаете массив по значению (оно копируется) для readAPuzzle. Функция читает в свою локальную копию, которая уничтожается при возврате функции. Вместо этого передайте по ссылке (это позволяет избежать копирования и использовать вместо этого оригинал):

void readAPuzzle(array2d_t& grid)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...