zoukankan      html  css  js  c++  java
  • STL erase() 迭代器失效

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

  • 相关阅读:
    每周总结
    5月2日学习日志
    5月1日学习日志
    4月30日学习日志
    4月29日学习日志
    4月28日学习日志
    4月27日学习日志
    每周总结
    vue滚动插件BetterScroll
    vue 获取页面高度
  • 原文地址:https://www.cnblogs.com/onlyDIABLO/p/4274370.html
Copyright © 2011-2022 走看看