当我删除std :: vector的成员时,为什么我的程序崩溃了

时间:2012-08-07 12:27:26

标签: c++ stl

我有一个类似下面的矢量

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";

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

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

被清除元素的位置和向量末尾之间的迭代器由erase()无效。请参阅here