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

Я пытаюсь работать с векторами векторов ints для решателя судоку, который я пишу.

Вопрос 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);
}

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

Я выгрузил строку объявления сетки с:

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

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

Вопрос 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

Где тест судоку является файлом, содержащим следующее:

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

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

6
задан Salaban 27 February 2010 в 22:01
поделиться

1 ответ

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

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

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

void readAPuzzle(array2d_t& grid)
6
ответ дан 17 December 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: