【问题标题】:Iterator returns garbage [duplicate]迭代器返回垃圾[重复]
【发布时间】:2013-03-19 17:27:08
【问题描述】:

无法弄清楚我哪里出错了。据我了解,此代码应返回“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

【问题讨论】:

  • “因为我在我的实际代码中将向量传递给函数” - 如果你将它传递给函数,那么为什么它需要是全局的?这似乎是矛盾的。
  • JBentley - 我的错误,我的意思是我在函数中使用它们并且不想传递它们。
  • See this answer 了解迭代器失效的解释。
  • @David OOP 方法是使向量成为类的私有成员,并使用对其进行操作的公共成员函数。

标签: c++ vector iterator


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    (强调我的。)

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

    【讨论】:

      【解决方案3】:

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

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

      正如 Kevin 所说,使用 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;
      

      【讨论】:

        猜你喜欢
        • 2017-06-13
        • 1970-01-01
        • 2011-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多