为什么我的多维向量只有push_back 0索引?

时间:2014-05-18 02:36:56

标签: c++ vector push-back

我在使用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。我哪里出错?

2 个答案:

答案 0 :(得分:1)

您永远不会重置cols。相反,你只是继续添加它。我认为您正在使用幻数索引打印rows,这就是为什么您没有发现添加的部分。在循环中声明临时cols或在每个clear后调用push_back()

答案 1 :(得分:0)

awesomeyi找到了你的主要问题。但是你的代码也有其他问题。

缓冲区溢出。例如,如果size == 4square == 2 我们得到:

  • 在#1之后:counter == 2;从2&lt; = 4
  • 继续
  • 在#2之后:counter == 4;继续4&lt; = 4
  • iter#3:读取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);
}