3

无法弄清楚我哪里出错了。据我了解,此代码应返回“1、2、3”,但我得到以下信息。我需要全局声明的向量及其迭代器,因为我将向量传递给实际代码中的函数,并且还需要在某些函数中更新迭代器。任何帮助表示赞赏!

#include <iostream>
#include <vector>

using namespace std;

vector<float> grid;
vector<float>::iterator gridPtr;

int main()

{
  grid.push_back(1);
  grid.push_back(2);

  gridPtr = grid.begin();

  grid.push_back(3);

  cout << "gridPtr: " << *gridPtr << endl;

  gridPtr++;

  cout << "gridPtr: " << *gridPtr << endl;

  gridPtr++;

  cout << "gridPtr: " << *gridPtr << endl;
}

这将返回:

gridPtr: 2.62257e-33
gridPtr: 2
gridPtr: 0
4

3 回答 3

4

push_back()可能使所有迭代器无效。也就是说,如果它必须重新分配后备存储,所有现有的迭代器都会失效。

如果您提前知道要推送多少元素,则可以使用reserve()预分配必要的内存,这将防止push_back()重新分配(从而使迭代器无效)。

于 2013-03-29T01:34:20.873 回答
2

来自http://en.cppreference.com/w/cpp/container/vector/push_back

如果 newsize()大于capacity(),则所有迭代器和引用都无效。

(强调我的。)

当您考虑幕后发生的事情时,这是有道理的。avector通过填充动态分配的数组来工作;当它满了时,它需要重新分配一个更大的,然后把所有东西都搬过去。

于 2013-03-29T01:34:30.687 回答
1

iterator当您执行 a 时,您可能会使其无效push_back,如果您删除该行,它应该可以正常工作。以下将按预期工作:

grid.push_back(1);
grid.push_back(2);

gridPtr = grid.begin();
cout << "gridPtr: " << *gridPtr << endl;
gridPtr++;
cout << "gridPtr: " << *gridPtr << endl;

正如凯文所提到的,使用reserve预先分配足够的内存也可以解决这个问题:

grid.reserve(3) ;
grid.push_back(1);
grid.push_back(2);

gridPtr = grid.begin();

grid.push_back(3) ;
cout << "gridPtr: " << *gridPtr << endl;
gridPtr++;
cout << "gridPtr: " << *gridPtr << endl;
gridPtr++;
cout << "gridPtr: " << *gridPtr << endl;
于 2013-03-29T01:34:46.647 回答