我正在尝试使用我正在编写的数独拼图解算器的int矢量向量。
问题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()的第一次调用给出了一个空白网格,而我应该看到一个0x的9x9网格,因为这是我初始化它的方式。第二个调用应该包含上面的网格。但是,两次都是空白。
任何人都可以对此有所了解吗?
答案 0 :(得分:5)
Q1:是的,这是处理它的正确方法。但是,请注意嵌套向量是实现2D数组的一种相当低效的方法。一个向量和x + y * width
计算指数通常是一个更好的选择。
Q2A:计算grid[i][j] + " "
不会连接两个字符串(因为左侧是int,而不是字符串),而是将数值添加到指针(字符串的第一个字符的内存地址) “)。请改用cout << grid[i][j] << " "
。
Q2B:您正在为readAPuzzle
按值传递数据(它被复制)。该函数读入其本地副本,该函数在函数返回时被销毁。通过引用传递(这避免了复制并使用原始版本):
void readAPuzzle(array2d_t& grid)