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. 非常值得学习的java 绘图板源代码

    package minidrawpad; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; impor ...

  2. -webkit-filter是神马?

    这些滤镜效果最初是用于SVG的,W3C引入到CSS中,然后制定了CSS Filter Effects 1.0,现在webkit率先支持了它.   现在规范中支持的效果有:   - grayscale ...

  3. nodejs 文件查找中文,替换为英文

    帮以前同事解决一个需求,中文项目 翻译 英文项目~~~ 考虑到具体实现方面的问题,如果智能的话,肯定是要做中文的语法分析,不过感觉这个有难度. 所以最后的方案是遍历文件,将中文短语匹配出来,再进行人工 ...

  4. 'gbk' codec can't encode character

    做爬虫抓取网页,print(html)进行调试,遇到UnicodeEncodeError: 'gbk' codec can't encode character XX in position XX问题 ...

  5. MVC自学第二课

    鉴赏一个软件开发框架最好的办法是投入其中并使用它.本课将使用ASP.NET MVC框架创建一个简单的数据录入应用程序.为简化起见,本课涉及到的一些技术细节在这里可能会跳过,会在以后的课程中再详细说明. ...

  6. delphi 基础书籍推荐

    本文所推荐的书,我均仔细读过,受益良多. 1. Pascal 精要.下载Pascal精要 本书讲Pascal 语言基本知识. 2. Object Pascal 参考(中英文对照版).下载Object ...

  7. 紫薇~还记得大明湖畔的HTML5智力拼图吗?

    曲线谜团是非常有趣的HTML5智力游戏,据说超过多少分会有惊喜,游戏简单易操作,偶尔抛弃那种杀死脑细胞的大型游戏,玩玩这种简单经典的益智小游戏,放松放松,也是不错的选择嘛-将游戏 通过 统一开发环境( ...

  8. Error copying image in the datastore: Not allowed to copy image file

    opennebula error copying image in the datastore not allowed to copy image file Error copying image i ...

  9. C++面试题一大波

    //打印1到最大的n位数. //题目:输入数字n.按顺序打印出从1到最大的n位十进制数.比方: //输入3.则打印出1.2.3一直到最大的3位数999. //[陷阱]:这个题目非常easy想到的办法就 ...

  10. _视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途

    iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 ...