Как мне работать с вложенными векторами в C ++?

c++ vector

8025 просмотра

1 ответ

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

Вопрос 1:

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

Например:

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, поскольку именно так я ее инициализировал. Второй вызов должен содержать сетку выше. Тем не менее, оба раза это пусто.

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

Автор: Salaban Источник Размещён: 12.11.2019 09:26

Ответы (1)


6 плюса

Решение

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

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

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

void readAPuzzle(array2d_t& grid)
Автор: Tronic Размещён: 27.02.2010 10:04
Вопросы из категории :
32x32