最近在写代码时,用到了vector中的erase方法,结果运行下面看似正确的代码时发现会抛出异常!!!
#include <vector>
#include <iostream>
using namespace std;
int main(void)
{
vector<int> vec = {1,2,3,4,5};
for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++)
{
cout << *iter << endl;
if (3 == *iter)
{
vec.erase(iter);
}
}
return 0;
}
原因如下:
查看cplusplus(点击查看)文档时发现iterator进行erase操作,被删除的迭代器将会失效,上面这个代码会在iter++
处崩溃
利用erase的返回值:
An iterator pointing to the new location of the element that followed the last element erased by the function call. This is the container end if the operation erased the last element in the sequence.
指向元素的新位置的迭代器,该元素位于函数调用删除的最后一个元素之后。 如果操作删除了序列中的最后一个元素,则这是容器的结尾。
上面这些摘自cpluplus网站,以上述代码为例,在erase之后返回值是指向4的,此时因为后面依然有iter++的操作,所以需要iter - -
所以应该修改如下:
#include <vector>
#include <iostream>
using namespace std;
int main(void)
{
vector<int> vec = {1,2,3,4,5};
for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++)
{
if (3 == *iter)
{
iter = vec.erase(iter);
iter--;
}
}
return 0;
}