Я пытаюсь работать с векторами векторов 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 с тех пор, именно так я инициализировал его. Второй вызов должен содержать сетку выше. Однако оба раза это - пробел.
Кто-либо может пролить некоторый свет на это?
Q1: Да, это правильный способ справиться с этим. Однако обратите внимание, что вложенные векторы - довольно неэффективный способ реализации 2D-массива. Один вектор и вычисление индексов по x + y * width
обычно является лучшим вариантом.
Q2A: Расчет grid [i] [j] + ""
не объединяет две строки (потому что левая часть - int, а не строка), а вместо этого добавляет числовое значение к указателю ( адрес памяти первого символа строки ""). Вместо этого используйте cout << grid [i] [j] << ""
.
Q2B: Вы передаете массив по значению (он копируется) для readAPuzzle
. Функция считывает свою локальную копию, которая уничтожается, когда функция возвращается. Вместо этого передайте по ссылке (это позволяет избежать копирования и вместо этого использовать оригинал):
void readAPuzzle(array2d_t& grid)