迭代器(iterators)

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;
};
时间: 2024-10-24 15:44:07

迭代器(iterators)的相关文章

学习7: 列表生成式,生成器,迭代器,可迭代对象

1) 列表生成式,即创建列表的方式 列表生成式,这里是中括号[] >>> [x*x for x in range(0,10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> [x * x for x in range(1, 11) if x % 2 == 0] [4, 16, 36, 64, 100] >>> [m + n for m in 'ABC' for n in 'XYZ'] ['AX', 'AY', 'AZ

生成器和迭代器

迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 使用迭代器的优点 对于原生支持随机访问的数据结构(如tuple.list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值).但对于无法随机访问的数据结构(比如set)而言,迭代器是唯一的访问元素的方式. 另外,迭代器的一大优点是不要求事先准备好整个迭代过程中

STL基础--迭代器和算法

1 迭代器 Iterators 5种迭代器类型 随机访问迭代器: vector, deque, array // 允许的操作 vector<int> itr; itr = itr + 5; // itr往前移5步 itr = itr - 4; if (itr2 > itr1) ... ++itr; // 前置的比后置的快 --itr; 双向迭代器: list, set/multiset, map/multimap // 允许的操作 list<int> itr; ++itr;

枚举和迭代器

Enumeration 和 Iterators 先来说一下 Enumerator 枚举器: 枚举器是一个只读的,作用于一序列值的,只能向前的游标. 枚举器是一个实现了下列任意接口的对象: System.Collections.IEnumerator System.Collections.Generic.IEnumerator<T> 从技术上来说,任何一个含有名为MoveNext 方法和名为 Current 的属性对象,都会被当作枚举器来对待. foreach 语句会迭代可枚举的对象(enume

Java源码解析之HashMap

一.HashMap类声明: HashMap继承于AbstractMap并且实现了接口Map,Cloneable,Serializable. public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {} 二.HashMap类层次: HashMap实现了三个接口,继承一个抽象类.除此之外我们应该知道Object是所有类的超类.之所以有一个A

相比于python2.6,python3.0的新特性。

这篇文章主要介绍了相比于python2.6,python3.0的新特性.更详细的介绍请参见python3.0的文档. Common Stumbling Blocks 本段简单的列出容易使人出错的变动. print语句被print()函数取代了,可以使用关键字参数来替代老的print特殊语法.例如: Old: print "The answer is", 2*2 New: print("The answer is", 2*2) Old: print x,       

STL 六大组件, 功能与运用概要

1. 容器(constainers) 现成的模版形式的数据结构, 如 vector, deque, set, map... 主要用来存放数据; 2. 算法(algorithms) 我倾向于叫做泛型算法, 常见的有 sort, search, copy, erase... 主要用函数模板实现; 3. 迭代器(iterators) 虽然 C++ 是 C 的超集, 但是一个指针满天飞的 programer 从某种意义上来说不是一个好的 C++er. 迭代器主要扮演容器预算法间的媒介, 所谓的 "泛型指

通读《STL源码剖析》之后的一点读书笔记

[QQ群: 189191838,对算法和C++感兴趣可以进来] 直接逼入正题. Standard Template Library简称STL.STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adaptors).算法(algorithms).仿函数(functors)六个部分. 迭代器和泛型编程的思想在这里几乎用到了极致.模板或者泛型编程其实就是算法实现时不指定具体类型,而由调用的时候指定类型,进行特化.在STL中,迭代器保证了ST

字典对象的 Pythonic 用法(上篇)

字典对象在Python中作为最常用的数据结构之一,和数字.字符串.列表.元组并列为5大基本数据结构,字典中的元素通过键来存取,而非像列表一样通过偏移存取.笔者总结了字典的一些常用Pyhonic用法,这是字典的Pythonic用法的上篇 0. 使用 in/not in 检查 key 是否存在于字典 判断某个 key 是否存在于字典中时,一般初学者想到的方法是,先以列表的形式把字典所有键返回,再判断该key是否存在于键列表中: dictionary = {} keys = dictionary.ke