我在使用push_back()
时遇到问题,我无法弄清楚为什么只有第一个cols
向量被反复推送。
输入
10 9 10 3 100 8 7 10 73 9 10 5 9 87 -1 8 3 7 10 92 6 10 6 83 9 11 8 8 77 -1 10 10 10 10 100 10 10 10 100 10 10 10 10 100 -1 DONE
的 C ++
(...)
size = numbers.size();
counter = 0;
square = ceil(sqrt(size));
vector < vector <int> > rows;
vector<int> cols;
do {
for (int i = 0; i < square; ++i) {
cols.push_back(numbers[counter]);
cout << cols[i] << " ";
++counter;
}
rows.push_back(cols);
cout << endl;
} while (counter <= size);
(...)
不良输出
0: 10 9 10 3 100 8 7
1: 10 9 10 3 100 8 7
2: 10 9 10 3 100 8 7
3: 10 9 10 3 100 8 7
4: 10 9 10 3 100 8 7
5: 10 9 10 3 100 8 7
6: 10 9 10 3 100 8 7
rows[1][2]
应该是73
,而不是9
。我哪里出错?
答案 0 :(得分:1)
您永远不会重置cols
。相反,你只是继续添加它。我认为您正在使用幻数索引打印rows
,这就是为什么您没有发现添加的部分。在循环中声明临时cols
或在每个clear
后调用push_back()
。
答案 1 :(得分:0)
缓冲区溢出。例如,如果size == 4
则square == 2
我们得到:
2
;从2&lt; = 4 4
;继续4&lt; = 4 numbers[4]
和numbers[5]
- oops!循环条件应为:
while (counter + square <= size);
我们需要确保下一次迭代完成而不会溢出向量。使用.at()
进行矢量访问是明智的,这样如果你确实做了一个错误的计算,那么错误就会表现得很好而不是搞乱。
循环(减去输出)实际上可以写成:
for (size_t counter = 0; counter + square <= size; counter += square )
{
std::vector<int> cols( numbers.begin() + counter, numbers.begin() + counter + square );
rows.push_back(cols);
}