关于vector::erase的问题
vector::erase在VC6.0和VS2010中有不同的表现
#include<iostream>
#include<vector>
#include<cassert>
using namespace std;
int main(void)
{
vector<int> vec;
vec.push_back(1);
vec.push_back(6);
vec.push_back(7);
vec.push_back(5);
vector<int>::iterator it1=vec.begin();
vector<int>::iterator it2=it1;
/* 例子1
vec.erase(it1);
cout<<*it1<<endl;
*/
/* 例子2
for(;it1!=vec.end();)
{
if(6==*it1)
{
it2=it1;
cout<<(int*)it2<<endl;
vec.erase(it2);
cout<<(int*)it2<<endl;
cout<<*it2<<endl;
}
it1++;
}
*/
cout<<vec.size()<<endl;
system("pause");
return 0;
}
同样的一段代码,插入4个数字,1,6,7,5,
对于例子1,在VC6上,运行结果为6,我们可以得知此时迭代器it1指向的内容就是6,单步调试下,发现it1的值没有改变,即我们可以做出这样的猜测--->在VC6上,删除(erase)it1之后,it1指向的后面的内容会自动往前覆盖,即此时6占据原来存放1的内存位置(1被删除),7占据原来6的位置,5占据原来7的位置。
但是在VS2010上,程序运行会崩溃,编译没问题。c++ primer上解释的是,vector.erase(p)之后,所有指向p所指的内存的迭代器全部失效。即此时it1,it2全部失效。
对于例子2也是(把push_back(7)换成push_back(6),程序员面试宝典上面题目),这个例子本意是删除这4个元素中为6的元素,但若是在VC6上面,就会跳过第二个6,最后结果为1,6(第二个6),5,但若是在VS2010上,就会运行部通过。
最后,vector.erase函数的标准形式是:
iterator erase(iterator)
iterator erase(iterator first, iterator last) => [first,last)