【问题标题】:why does my program crash when I delete a member of std::vector为什么当我删除 std::vector 的成员时我的程序崩溃
【发布时间】:2012-08-04 11:15:26
【问题描述】:

我有一个像下面这样的向量

vector<unsigned int> myvector;
vector<unsigned int>::iterator it;

//fill it 
for (i=1; i<=10; i++) myvector.push_back(i);

//I want delete first one 
it = myvector.begin();
myvector.erase(it++);

//I want to know if I am in last element
if(it != myvector.end()) 
      cout << "a test";

但是在比较表达式中我的程序崩溃了。为什么?

【问题讨论】:

  • 此代码无法编译。没有vector::insert 方法接受一个参数。请贴出真实代码。

标签: c++ stl


【解决方案1】:

简单地说,因为在调用erase()之后,所有指向向量中被擦除位置或之后位置的迭代器都是无效的。例如,请参阅 here 以获取有关此内容的官方文档。

【讨论】:

    【解决方案2】:

    因为erase() 在擦除点和之后使迭代器无效。

    OTOH,返回值是一个迭代器,指向擦除后的元素,所以你可以这样做:

    it = myvector.erase(it);
    if (it == myvector.end()) { ... }
    

    【讨论】:

      【解决方案3】:

      你不应该在擦除它时增加'i',因为擦除返回下一个有效的迭代器

      我认为这可能回答了你的问题

      https://stackoverflow.com/a/4645727/623546

      【讨论】:

        【解决方案4】:

        被擦除元素的位置和向量结尾之间的迭代器被erase() 失效。见here

        【讨论】:

          猜你喜欢
          • 2012-02-13
          • 1970-01-01
          • 2011-06-10
          • 1970-01-01
          • 2017-05-02
          • 1970-01-01
          • 2022-01-15
          • 2016-12-21
          • 1970-01-01
          相关资源
          最近更新 更多