vector、list、map三个容器在执行erase的效果:
在vs2005中vector在执行erase后,在erase参数中的_it所指向的位置开始,一直到后面,所有的_iterator无效,但之前的还是有效的.比如下面代码
vector<int> vint;
vint.push_back(1);
vint.push_back(2);
vint.push_back(3);
vint.push_back(4);
vector<int>::iterator _itv = vint.begin();
vector<int>::iterator _itv2 = ++_itv;
vector<int>::iterator _itv3 = ++_itv;
_itv = vint.begin();
vint.erase(_itv2); //执行后,_itv2前面的_itv有效,但后面_itv3崩溃,_itv2本身也是无效的
int yv = *_itv;
int yv3 = *_itv3; //vs2005执行崩溃,但在vc6.0中还是可以的,vs2005自带的stl增加了自己的容错机制
list、map容器在执行erase后,只有参数指向的_iterator的对象无效,其它的无论是后面位置还是前面位置的_iterator都是有效的
list<int> lint;
lint.push_back(1);
lint.push_back(2);
lint.push_back(3);
lint.push_back(4);
list<int>::iterator _itl = lint.begin();
list<int>::iterator _itl2 = ++_itl;
list<int>::iterator _itl3 = ++_itl;
_itl = lint.begin();
lint.erase(_itl2);
int yl = *_itl; //访问有效
int yl2 = *(++_itl3); //访问有效
在对容器操作erase是,尽量使用erase的返回值
_itl2 = lint.erase(_itl2);