一、序列式容器(数组式容器)
对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。所以不能使用erase(iter++)的方式,还好erase方法可以返回下一个有效的iterator。
1 for (iter = cont.begin(); iter != cont.end();)
2 {
3 (*it)->doSomething();
4 if (shouldDelete(*iter))
5 iter = cont.erase(iter); //erase删除元素,返回下一个迭代器
6 else
7 ++iter;
8 }
迭代器失效:
1 void vectorTest()
2 {
3 vector<int> container;
4 for (int i = 0; i < 10; i++)
5 {
6 container.push_back(i);
7 }
8
9 vector<int>::iterator iter;
10 for (iter = container.begin(); iter != container.end(); iter++)
11 {
12 if (*iter > 3)
13 container.erase(iter);
14 }
15
16 for (iter = container.begin(); iter != container.end(); iter++)
17 {
18 cout<<*iter<<endl;
19 }
20 }
报错是:vectoriterator not incrementable.
迭代器在执行++操作时报错!已经失效的迭代器不能再进行自增运算了。++代码大致实现如下:
1 _Myiter operator++(int)
2 {
3 _Myiter _Tmp=*this;
4 ++*this;
5 return (_Tmp);
6 }
对于序列式容器,比如vector,删除当前的iterator会使后面所有元素的iterator都失效。这是因为顺序容器内存是连续分配(分配一个数组作为内存),删除一个元素导致后面所有的元素会向前移动一个位置。(删除了一个元素,该元素后面的所有元素都要挪位置,所以,iter++,已经指向的是未知内存)。
但是erase方法可以返回下一个有效的iterator。所以代码做如下修改,就OK了。
1 void vectorTest()
2 {
3 vector<int> c

最低0.47元/天 解锁文章
1754

被折叠的 条评论
为什么被折叠?



