`
unsoundboy
  • 浏览: 60820 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

STL中的容器的遍历的使用方法

    博客分类:
  • c++
 
阅读更多
STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。
      在使用 list、set 或 map遍历删除某些元素时可以这样使用:

正确使用方法1      std::list< int> List;
      std::list< int>::iterator itList;
      for( itList = List.begin(); itList != List.end(); )
      {
            if( WillDelete( *itList) )
            {
               itList = List.erase( itList);
            }
            else
               itList++;
      }

       或

正确使用方法2      std::list< int> List;
      std::list< int>::iterator itList;
      for( itList = List.begin(); itList != List.end(); )
      {
            if( WillDelete( *itList) )
            {
               List.erase( itList++);
            }
            else
               itList++;
      }

     
      下面是两个错误的使用方法:

错误使用方法1      std::list< int> List;
      std::list< int>::iterator itList;
      for( itList = List.begin(); itList != List.end(); itList++)
      {
            if( WillDelete( *itList) )
            {
               List.erase( itList);
            }
      }

         或
错误使用方法2      std::list< int> List;
      std::list< int>::iterator itList;
      for( itList = List.begin(); itList != List.end(); )
      {
            if( WillDelete( *itList) )
            {
               itList = List.erase( ++itList);
            }
            else
               itList++;
      }

      正确使用方法1:通过erase方法的返回值来获取下一个元素的位置
      正确使用方法2:在调用erase方法之前先使用 “++”来获取下一个元素的位置
      错误使用方法1:在调用erase方法之后使用“++”来获取下一个元素的位置,由于在调用 erase方法以后,该元素的位置已经被删除,如果在根据这个旧的位置来获取下一个位置,则会出现异常。
      错误使用方法2:同上。

      这里“++”运算符与我们平常的理解刚好相反,erase( itList++) 是先获取下一个元素的位置在删除; erase( ++itList) 是删除以后再获取下一个元素的位置。

     在使用 vector、deque遍历删除元素时,也可以通过erase的返回值来获取下一个元素的位置:
正确使用方法      std::vector< int> Vec;
      std::vector< int>::iterator itVec;
      for( itVec = Vec.begin(); itVec != Vec.end(); )
      {
            if( WillDelete( *itVec) )
            {
                 itVec = Vec.erase( itVec);
            }
            else
               itList++;
      }
     
      注意:vector、deque 不能像上面的“正确使用方法2”的办法来遍历删除。

假如有一个列表 ShipList,里面的内容是0、1、2、3...9, 如果要从中删除那些取余3后为0或为1的数,删除后应该得出的结果是 2、5、8。
但如果是这样操作:
std::<int >::iterator it;
for( it = ShipList.begin(); it != ShipList.end(); it++)
{
if( (*it) % 3 == 0 || (*it) % 3 == 1)
ShipList.erase( it++);
}
这样的话会有两个问题,一个是得出的结果是 1、2、4、5、7、8(没有删除取余3后等于1的数);另外一个问题是当执行到列表中最后一个元素(即ShipList.end() - 1 )时,迭代器可能还会执行两次“++”,如果是这样那么it就到达了 ShipList.end() + 1 的位置,这样也会报错。

erase( itList++) 是先获取下一个元素的位置再删除; erase( ++itList) 是删除以后再获取下一个元素的位置。
我认为,erase(itList++)是itList先传递值给erase(),然后再自增;
erase(++itList) 是先自增,然后再把自增后的值传递给erase(),这个是出错的根源。
分享到:
评论

相关推荐

    STL学习过程中的代码笔记

    其中,容器是STL中最常用的部分之一。使用容器可以方便地存储和管理数据,例如使用vector动态数组来存储元素,使用map实现键值对的映射关系等。此外,STL中的算法也让我受益匪浅。通过调用STL提供的算法函数,可以...

    C++课程小作业-STL容器与迭代器的实现路径-设计类vector容器myVector

    选代器是容器与算法的粘合剂,是所谓的泛型指针, 使用类模板方式,迭代器提供了访问容器中对象的方法,其实质是容器中对象的指针;而算法则为操作集合数据的通用算法, 也使用函数模板方式。这种巧妙的方法, 让我们在...

    C++ STL案例(vector+deque容器)

    案例-评委打分 有5名选手:选手12345,10个评委分别对每一名选手打分,去除最高分,去除评委中最低分,取平均分。 实现步骤: 创建五名选手,放到vector中 ...deque容器遍历一遍,累加总分 获取平均分

    福优林@Qt5小白变大牛初级篇word---第4章.pdf

    为容器遍历提供了两种迭代器(Java-style,STL-style),并且QT提供了foreach关键字,更加方便元素遍历。其中,Java风格的迭代器更容易使用,特别是对于Java工作人员来说,它提供了高层次的函数;然而,STL风格的...

    标准模板库STL

    STL容器部分主要由头文件、、、、、和组成。 (2)算法(Algorithms)。包括各种基本算法,如比较、交换、查找、排序、遍历操作、复制、修改、移除、反转、合并等等。 STL算法部分主要由头文件和组成。 (3)...

    二叉树的前,中,后序非递归,递归遍历,层次遍历,最长路径

    二叉树的前,中,后递归,非递归遍历,层次遍历,最长路径,采用C++实现,用了sTL的容器,附带测试样例,采用tree.exe 测试

    c++实现STL容器

    实现了vector list set map 可以使用iterator遍历 插入 删除等功能

    C++ STL(vector+multimap容器)案例

    公司今天招聘了10个员工,10名员工进入公司之后,需要指派员工在那个部门...遍历vector容器,取出每个员工,进行随机分组 分组后,将员工部门编号作为key,具体员工作为value,放入到multimap容器中 分部门显示员工信息

    C++STL集合.pptx

    C++ 集合的特点,原理,使用 ...平衡二叉检索树的检索使用中序遍历算法,中序遍历算法可将键 值由小到大遍历出来,所以,可以理解为平衡二叉检索树在插入 元素时,就会自动将元素按键值由小到大的顺序排列。

    STL标准模板库的例子

    容器类(可以存储其他对象的对象),算法(一系列封装好的函数),迭代器(用于遍历操作的类) 容器可以直接存储对象,也可以存储对象的指针。成熟的程序员喜欢使用间接存储。 容器主要包括两种类型:序列类(一般...

    C++语言 STL容器list总结

    STL 中的list 就是一 双向链表,可高效地进行插入删除元素。 list不支持随机访问。所以没有 at(pos)和operator[]。 list 对象list1, list2 分别有元素list1(1,2,3),list2(4,5,6) 。list&lt; int&gt;::iterator it; 构造...

    Qt容器类(QList,QMap)遍历器的使用

    Qt容器类比较典型的就是QList,QMap,遍历器的使用分为STL风格和Java风格。

    关于STL的erase()陷阱-迭代器失效问题的总结

    STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。 1.list,set...

    hadoop_3hadoop_3

    MapReduce中最重要的两个词就是Map(映射)和Reduce(规约)。...比如你要对一个STL的容器进行查找,需要制定每两个元素相比较的Functor(Comparator),这个Comparator在遍历容器的时候就会被调用。

    hadoop_2hadoop_2

    MapReduce中最重要的两个词就是Map(映射)和Reduce(规约)。...比如你要对一个STL的容器进行查找,需要制定每两个元素相比较的Functor(Comparator),这个Comparator在遍历容器的时候就会被调用。

    二叉查找排序树的实现代码

    最近在研究数据结构这本书,自己动手实现的一个二叉查找排序树的类BinSortTree,实现数据的插入,查找,删除,层序遍历,中序遍历等...其实这个跟stl的set容器已经十分相似,只是set使用查找性能更优越的红黑树来实现

    stl容器set,map,vector之erase用法与返回值详细解析

    在使用 list、set 或 map遍历删除某些元素时可以这样使用,如下所示

    C++STL程序员开发指南【可搜索+可编辑】

    1-3-2 在派生类中实现类的基本函数,................... _ ............... 29 1-3-3 内联函数技术,........ ................................... 30 3133 ..... .. .. .. .. .. .. .. .. .. .. .. .. .....

    标准库文件

    STL有三个主要组成部分 容器(container) 迭代器(iterator) 算法(algorimth) 容器和迭代器都是类模板。迭代器用于遍历容器中的没一个元素。算法用于操作数据。

    C++进阶课程讲义_v1.0.4.pdf

    10.3.2STL算法中函数对象和谓词 138 10.3.3常用的遍历算法 148 10.3.4常用的查找算法 152 10.3.5常用的排序算法 154 10.3.6常用的拷贝和替换算法 156 10.3.7常用的算术和生成算法 157 10.3.8常用的集合算法 158 10.4...

Global site tag (gtag.js) - Google Analytics