`
unsoundboy
  • 浏览: 63213 次
  • 性别: 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(),这个是出错的根源。
分享到:
评论

相关推荐

    C++ STL list 遍历删除出错解决方案

    本篇文章主要探讨的是在使用STL list时遇到的遍历删除元素过程中常见的错误及其解决方案。 错误用法通常出现在尝试同时遍历和删除list中的元素时。以下是三种常见的错误做法: 1. 错误用法一: 在这个例子中,迭代...

    stl_set容器详细使用方法

    STL Set 容器详细使用方法 STL(Standard Template Library)中的 Set 容器是一种关联容器,用于存储唯一的元素,且自动排序。下面是 STL Set 容器的详细使用方法。 元素类型 Set 容器中元素的类型可以是任何类型...

    C++ STL vector 容器介绍

    学习`vector`容器时,还需要理解其与其他STL容器如`deque`、`list`和`array`的区别,以便在不同的场景下选择最合适的容器。例如,`deque`在两端插入和删除更高效,`list`则适合频繁的插入和删除,而`array`是固定...

    STL中容器算法使用说明大全

    在这个“STL中容器算法使用说明大全”中,我们将深入探讨几个核心的STL容器,如vector、Map和set,以及相关的算法。 1. **STL容器**: - **vector**:动态数组,提供高效随机访问,支持在末尾快速插入和删除元素。...

    C++_STL之set容器使用方法

    ### C++ STL之set容器使用方法 #### 一、引言 在C++标准模板库(STL)中,`set`容器是一种非常重要的关联容器,主要用于存储唯一元素,并且这些元素会根据其键值自动排序。`set`内部通常采用红黑树(一种自平衡的二叉...

    STL -容器,string容器

    在使用STL容器时,我们可以使用迭代器来遍历容器中的元素。迭代器是一种特殊的指针,它可以指向容器中的元素,并提供了丰富的操作方法来访问和操作容器中的元素。 在STL容器中,我们可以使用算法来对容器中的元素...

    STL的容器deque的使用

    在VC6.0中使用deque,需要包含`&lt;deque&gt;`头文件,并确保编译选项设置正确,启用STL支持。下面是一个简单的例子: ```cpp #include #include int main() { std::deque&lt;int&gt; myDeque; // 添加元素 myDeque.push...

    c++/STL容器设计相关

    本节将深入探讨STL容器的设计与使用,包括其基本概念、类型、操作以及在实际编程中的应用。 一、STL容器概述 STL容器是一种对象,它们可以存储、管理和操作其他对象。STL提供了多种不同类型的容器,如向量(vector...

    STL顺序容器:list的使用

    与另一种常见的STL容器向量(vector)相比,list的主要特点在于它的操作特性。 1. 插入和删除效率高:由于list的元素不是连续存储的,所以在任何位置插入或删除元素时,只需要修改相邻元素的指针即可,时间复杂度为...

    STL容器使用代码

    STL(Standard Template Library,标准模板库)是C++编程语言中的一个重要组成部分,它提供了高效且灵活的数据结构和算法。在STL中,容器是一类能够...通过学习这些代码,你可以更好地理解STL容器的API和实际操作方式。

    使用STL写的学生管理系统

    在C++编程中,STL(Standard Template Library,标准模板库)是不可或缺的一部分,它提供了一组高效、灵活且可重用的容器、迭代器、算法和函数对象。本项目"使用STL写的学生管理系统"旨在利用STL的VECTOR和LIST容器...

    gdb中查看stl容器命令封装脚本

    在复杂的程序中,尤其是当涉及到STL容器时,有效地查看和理解这些容器的状态是调试的关键。本文将详细介绍如何使用GDB来查看STL容器,并特别关注一个名为"gdbinit"的脚本,它能够帮助我们封装这些命令,提高调试效率...

    STL中文手册 doc文档

    “STL中文手册 doc文档”很可能会详细解释这些组件的使用方法、操作步骤、注意事项以及常见问题的解决策略。它将涵盖如何声明和实例化容器,如何使用迭代器遍历和修改元素,如何应用各种算法,以及如何自定义函数...

    STL容器multiset的使用

    在这个话题中,我们将深入探讨STL容器中的`multiset`,并结合VC6.0环境下的代码示例进行讲解。 **一、STL multiset简介** `multiset`是STL中的一种关联容器,它类似于`set`,但允许插入重复元素。`multiset`内部...

    STL常用容器1

    使用STL容器时,开发者可以根据实际需求选择最适合的容器。例如,如果需要高效随机访问,vector可能是最佳选择;如果需要高效插入和删除操作,list更适合;如果需要自动排序且键是唯一的,set或map则是理想选择。 ...

    STL各种使用方法实例

    本实例将详细讲解STL中常见的容器和算法的使用方法,帮助初学者深入理解并掌握STL的强大功能。 首先,我们来看STL中的容器: 1. **Map**: Map是一种关联容器,它按照键值(key)进行排序,并存储键值对(key-value...

    STL容器和算法函数表

    ### STL容器和算法函数表详解 #### 一、Vector类的主要成员 `vector&lt;T&gt;`是C++标准模板库(STL)中的动态数组实现,能够自动调整其大小,提供了高效的随机访问能力,是C++中最常用的数据结构之一。 ##### 容器属性 -...

    stl容器.zip

    在这个"stl容器.zip"压缩包中,包含了一个名为"stl容器.sln"的解决方案文件,很可能是一个C++项目,用于学习和实践STL容器的使用。 STL容器主要分为四大类:顺序容器、关联容器、容器适配器以及迭代器。接下来我们...

    c++STL容器讲义与演示

    通过实例,我们可以更清晰地了解如何使用STL容器。例如,创建一个vector存储整数,然后使用sort算法对其进行排序;使用map存储字符串和对应的值,通过迭代器遍历并打印所有键值对。 总结,C++ STL容器是强大且灵活...

    标准模板库STL的使用 实验报告.docx

    标准模板库STL的使用实验报告 在本实验报告中,我们将...通过本实验报告,我们学习了STL的使用,包括STL中的容器和算法,以及如何使用STL来解决实际问题。我们也了解了STL的优点,例如提高编程效率、降低编程难度等。

Global site tag (gtag.js) - Google Analytics