1.迭代器的概念

迭代器是一种抽象的设计概念。在设计模式中,迭代器模式定义为:提供一种方法,使之能够依序访问某个容器中所含的各个元素,而又无需暴露该容器的内部组织结构。

迭代器可以看做一种行为类似指针的对象,迭代器和指针一样都具有解引用和成员访问的功能。

2.迭代器的相关类型

通常在使用迭代器时需要使用迭代器所指的对象的类型或者迭代器所指对象的类型的指针类型或者引用类型等,这些通常称为迭代器相关类型。

在SGI-STL中,通常约定在每一种迭代器类型中内嵌定义该迭代器的相关类型,以便在以后需要时获取该迭代器的相关类型。

3.SGI-STL中迭代器的相关类型

在SGI-STL中迭代器定义了5种相关类型,如下:

value     type
different type
pointer type
reference type
iterator_category

(1)value type、point type、reference type与迭代器所指的对象有关,分别为迭代器所指对象的类型,指向该对象的指针的类型,该对象的引用类型

(2)different type用来表示指向该对象的指针的算术运算的值类型

(3)iterator_category表示该迭代器所属的类别。

4.迭代器的分类与从属关系

(1)迭代器分类

在SGI-STL中,根据可以对迭代器进行的算术操作(迭代器的移动特性)对该迭代器所指对象进行的操作对迭代器分为五类:

<1> Input Iterator: 迭代器只能自增向前移动,单趟移动;迭代器所指对象只能读(read-only),不能写

<2> Output Iterator: 迭代器只能自增向前移动,单趟移动;迭代器所指的对象只能写(write-only),不能读

<3> Forward Iterator:迭代器只能自增向前移动,多趟移动; 允许对该迭代器所指对象进行读写操作

<4> Bidirectional Iteator:迭代器可以自增和自减双向移动,多趟移动;可以对迭代器所指对象进行读写操作

<5> Random Access Iterator:迭代器允许所有可以对指针进行的算术运算,多趟移动;可以对该迭代器所指的对象进行读写操作

(2)迭代器从属关系

从迭代器的分类可以看出迭代器之间存在从属关系,比如:Forward Iterator可以看做Input Iterator的一种,其具有Input Iterator可以进行的所有操作,可以看做类之间的

is-a关系,所以在SGI-STL中使用类的继承来表示迭代器之间的从属关系;

struct input_iterator_tag { };
struct output_iterator_tag { };
struct forward_iterator_tag : public input_iterator_tag { };
struct bidirectional_iterator_tag : public forward_iterator_tag { };
struct random_access_iterator_tag : public bidirectional_iterator_tag { };

5.SGI-STL算法对于迭代器类型的命名规则

SGI-STL中规定:泛型算法中以该算法可以接受的最低阶的迭代器类型为该算法中的迭代器类型参数命名。

迭代器的类型是以类实现的,从属关系体现在类继承上;通过继承机制,可以接受某个基类对象的地方应该也可以接受该基类的派生类对象,然而可以接受某个基类派生类对象的地方不可以接受该基类对象,从而可以接受Input Iterator的算法也可以接受Forward Iterator等该迭代器类型类的派生类。

6.迭代器相关类型萃取

在SGI-STL中提供了一种机制用于萃取迭代器的相关类型。当需要获取一个迭代器的相关类型时使用迭代器萃取机制即可获取迭代器的相关类型。

迭代器的萃取机制使用模板实现,并使用偏特化对指针类型,const 指针类型进行特殊处理。

template <typename Iterator>
struct iterator_traits {
typedef typename Iterator::iterator_category iterator_category;
typedef typename Iterator::value_type value_type;
typedef typename Iterator::difference_type difference_type;
typedef typename Iterator::pointer pointer;
typedef typename Iterator::reference reference;
};

7.容器、迭代器、算法的关系

在SGI-STL中,设计迭代器类是需要考虑相应的该迭代器的相关类型;

设计容器的迭代器时,设计适当的迭代器是容器需要考虑的问题,每个容器的迭代器类设计不同,只有容器才知道如何来遍历访问容器中所有的元素,并且执行容器的迭代器可以执行的相关操作(前进或者后退,可以对迭代器所指对象的读写操作);

算法以迭代器为接口,而不考虑各个容器的迭代器在具体实现上的差别;

迭代器(iterators)的更多相关文章

  1. 集合的打印、列表List、迭代器Iterators

    集合的打印 必须使用 Arrays.toString() 来生成数组的可打印形式. 但是打印集合无需任何帮助. /** * 集合的打印 * @author myf */ public class Pr ...

  2. 【转】牛逼闪闪的Ruby迭代器

    D瓜哥最近想做一个网站,另外,老早就有学习一门动态语言的想法,满足着两个条件的编程语言中,Ruby.Python是最合适的两种语言.现在Ruby on Rails如日中天,光芒万丈!所以,就选定了Ru ...

  3. Python Iterables Iterators Generators

    container 某些对象包含其它对象的引用,这个包含其它对象引用的对象叫容器.例如list可以包含int对象,或者由其它数据类型(或数据结构)的对象组成一个list. 对其他对象的引用是容器值的一 ...

  4. STL基础--迭代器和算法

    1 迭代器 Iterators 5种迭代器类型 随机访问迭代器: vector, deque, array // 允许的操作 vector<int> itr; itr = itr + 5; ...

  5. Python之可迭代对象、迭代器、生成器

    在使用Python的过程中,很容易混淆如下几个关联的概念: 1.容器(container) 2.可迭代对象(Iterable) 3.迭代器(Iterator) 4.生成器(generator) 5.生 ...

  6. python基础-8迭代器(iter)和生成器(yield)

    一 生成器 从Python2.2起,生成器提供了一种简洁的方式帮助返回列表元素的函数来完成简单和有效的代码. 它基于yield指令,允许停止函数并立即返回结果.此函数保存其执行上下文,如果需要,可立即 ...

  7. python面试大全

    问题一:以下的代码的输出将是什么? 说出你的答案并解释. class Parent(object): x = 1 class Child1(Parent): pass class Child2(Par ...

  8. Python全栈之路8--迭代器(iter)和生成器(yield)

    一.生成器( iter ) 从Python2.2起,生成器提供了一种简洁的方式帮助返回列表元素的函数来完成简单和有效的代码. 它基于yield指令,允许停止函数并立即返回结果.此函数保存其执行上下文, ...

  9. [pyhton]python内建方法

    撸一遍python的内建方法 这样做的好处就是:我如果要完成一个功能的时候,如果能用内建方法完成,就用内建方法.这样可以提高效率,同时使自己的代码更加优雅.哎呦?那岂不是撸完就是python高手了?我 ...

随机推荐

  1. Android 数据库ORM框架GreenDao学习心得及使用总结<二>

    转:http://blog.csdn.net/xushuaic/article/details/24496191 第五篇 查询 查询会返回符合某些特定标准的实体.你可以使用原始的SQL定制查询语句,或 ...

  2. mud目录命令说明

      目錄結構 以下列出的是 ES2 mudlib 根目錄下標準的子目錄結構,以及簡短的說明. /adm 儲存由系統管理者所管理的程式與資料檔. /std 儲存標準物件的程式碼. /obj 儲存通用物件 ...

  3. symfony的安装

    Symfony 是一个基于MVC的PHP框架,最新版本为2.7 工作原理 Synfony安装的两种方法 1.使用composer进行安装 1)下载composer http://getcomposer ...

  4. Stream与byte转换

    将 Stream 转成 byte[] /// <summary> /// 将 Stream 转成 byte[] /// </summary> public byte[] Str ...

  5. Scala数组操作实战详解

    增删改查,要注意的是,Array数组是定长数组,ArrayBuffer数组才是变长数组. 其他集合也存在可变不可变.例如,List,Set,Map 多维数组定义方法与Java类似.

  6. 收藏的技术文章链接(ubuntu,python,android等)

    我的收藏 他山之石,可以攻玉 转载请注明出处:https://ahangchen.gitbooks.io/windy-afternoon/content/ 开发过程中收藏在Chrome书签栏里的技术文 ...

  7. 【Chromium中文文档】跨进程通信 (IPC)

    跨进程通信 (IPC) 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/I ...

  8. SQL Server 查看一个表上的索引

    方法:1 sys.indexes index_id =0:堆 index_id =1:聚集索引 index_id =2.....:非聚集索引 ----------------------------- ...

  9. ODI利用goldengate实现增量数据捕获

    ODI利用goldengate实现增量数据捕获 上个月,Oracle发布了ODI的最新版本10.1.3.6_02,其中增加了针对采用goldengate获取源数据库增量变化的知识模块,这样当系统需要实 ...

  10. [摘]ASP.Net标准控件(TextBox控件)

    TextBox控件 TextBox控件又称文本框控件,为用户提供输入文本的功能. 1.属性 TextBox控件的常用属性及说明如表1所示. 表1 TextBox控件常用属性及说明 属    性 说   ...