代码改变世界

STL erase() 迭代器失效

2015-02-05 11:39  onlyDIABLO  阅读(192)  评论(0编辑  收藏  举报

STL中的容器按存储方式分为两类:序列容器(如:vector 、deque、list);关联容器(如:set、map)

两种容器在使用erase方法来删除元素时或产生迭代器失效的问题

对于非顺序序列容器

 1 std::list<int> List;
 2 std::list<int>::iterator iter = List.begin();
 3 for(;iter!=List.end();)
 4 {
 5   if(needDelete(*iter))
 6   {
 7     iter= List.erase(iter);
 8   }
 9   else
10   {
11     iter++;
12       } 
13 }
14 
15 std::list<int> List;
16 std::list<int>::iterator iter = List.begin();
17 for(;iter!=List.end();)
18 {
19   if(needDelete(*iter))
20   {
21     List.erase(iter++);//iter自增操作 返回给erase原始值的副本 此时iter已经指向了下一个元素 但是由于序列容器在删除元素的时候回移动元素 这样的操作返回的下一个元素的迭代器也是失效的
22   }
23   else
24   {
25     iter++;
26       } 
27 }   

顺序序列容器(vector、deque)

代码和关联容器第一种方式一样 但是第二种方式不适用序列容器

关联容器(map set)

 删除方法和非顺序容器相同。

另外 在删除的时候可以使用remove/remove_if搭配erase的方式