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的方式