热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c++stl五种迭代器

cstl五种迭代器2010-12-3114:22:25|分类:CC|举报|字号订阅下载LOFTER我的照片书|迭代器的分类(IteratorCategories)In

c++ stl 五种迭代器  

2010-12-31 14:22:25|  分类: C++/C|举报|字号 订阅

下载LOFTER我的照片书  |






迭代器的分类(Iterator Categories)
Input Iterator: 只读向前遍历的迭代器。例如:istream。 
Output Iterator: 只写向前遍历的迭代器。例如:ostream, inserter。 
Forward Iterator: 可读可写向前遍历的迭代器。 
Bidirectional Iterator: 可读可写双向遍历迭代器。例如:list, set, multiset, map, multimap。 
Random Access Iterator: 可读可写随机访问迭代器。例如:vector, deque, string, array。 


1 Input Iterators
Input Iterator只能逐元素的向前遍历,而且对元素是只读的,只能读取元素一次。通常这种情况发生在从标准输入设备(通常是键盘)读取数据时。


下面是Input Iterator的可用操作列表:
*iter: 只读访问对应的元素 
iter->member: 只读访问对应元素的成员 
++iter: 向前遍历一步(返回最新的位置) 
iter++: 向前遍历一步(返回原先的位置) 
iter1 == iter2: 判断两个迭代器是否相等 
iter1 != iter2:判断两个迭代器是否不等 
TYPE(iter): 复制迭代器 



2 Output Iterators

Output iterator跟Input Iterator相对应,只能逐元素向前遍历,而且对元素是只写的(*iter操作不能作为右值,只能作为左值),只能写入元素一次。通常这种情况发生在向标准输出设备(屏幕或者打印机)写入数据时,或者利用inserter向容器中追加新元素时。


下面是Output Iterator的可用操作列表:
*iter = value: 向对应的元素写入新值 
++iter: 向前遍历一步(返回最新的位置) 
iter++: 向前遍历一步(返回原先的位置) 
TYPE(iter): 复制迭代器 



3 Forward Iterators

Forward Iterator是Input Iterator和Output Iterator的结合,虽然也只能逐元素向前遍历,但可以对元素进行读写操作。下面看Forward Iterator的可用操作列表:


*iter:  
iter->member:  
++iter:  
iter++:  
iter1 == iter2:  
iter1 != iter2:  
TYPE():  
TYPE(iter):  
iter1 = iter2:  



跟Input Iterator和Output Iterator不同的是,Forward Iterator可以对同一元素访问多次。
下面我们特别关注一下Forward Iterator和Output Iterator的区别:

(1)对于Output Iterator,写入数据时不检查目标容器是否到达结束位置是正确的做法,比如下面循环对于Output Iterator是成立的:
//ok for output iterator


//error for forward iterator
while(true) 
{
    *pos = foo();
    ++pos;
}

(2)对于Forward Iterator,则必须保证访问元素的有效性,那么上面形式对Forward Iterator来说是错误的,因为当碰到容器end()位置时,导致不确定的后果。对于Forward Interator,上面形式必须修改为这样:


while(pos != col1.end()) 
{
    *pos = foo();
    ++pos;
}



4 Bidirectional Iterators

双向迭代器行为特征类似于Forward Iterator,只是额外增加了一个逐元素向后遍历的能力。所以对于双向迭代器可用的操作,除了包含Forward Iterator的所有操作外,多了一组向后遍历的操作:


--iter: 向后遍历一步(返回最新的位置) 
iter--: 向后遍历一步(返回原有的位置) 



5 Random Access Iterators

随机访问迭代器除了有双向迭代器的能力特征外,还可以进行元素随机访问。所以对于随机访问迭代器,增加了关于“迭代器运算”的一些操作。下面是除了双向迭代器的所有操作外,额外的操作列表:


iter[n]: 直接访问索引为n的元素 
iter+=n: 向前或向后(n为负数)遍历n个元素 
iter-=n: 先后或向前(n为负数)遍历n个元素 
iter+n: 返回当前位置后面第n个元素的iterator位置 
n+iter: 同上 
iter-n: 返回当前位置前面第n个元素的iterator位置 
iter1-iter2: 返回iter1和iter2之间的距离(distance) 
iter1 iter1>iter2: 判断iter1是否在iter2之后 
iter1<&#61;iter2: 判断iter1是否不再iter2之后 
iter1>&#61;iter2: 判断iter1是否不再iter2之前

推荐阅读
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • ***byte(字节)根据长度转成kb(千字节)和mb(兆字节)**parambytes*return*publicstaticStringbytes2kb(longbytes){ ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
author-avatar
程驭飞龙_619
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有