迭代器(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;
};
7.容器、迭代器、算法的关系
在SGI-STL中,设计迭代器类是需要考虑相应的该迭代器的相关类型;
设计容器的迭代器时,设计适当的迭代器是容器需要考虑的问题,每个容器的迭代器类设计不同,只有容器才知道如何来遍历访问容器中所有的元素,并且执行容器的迭代器可以执行的相关操作(前进或者后退,可以对迭代器所指对象的读写操作);
算法以迭代器为接口,而不考虑各个容器的迭代器在具体实现上的差别;
迭代器(iterators)的更多相关文章
- 集合的打印、列表List、迭代器Iterators
集合的打印 必须使用 Arrays.toString() 来生成数组的可打印形式. 但是打印集合无需任何帮助. /** * 集合的打印 * @author myf */ public class Pr ...
- 【转】牛逼闪闪的Ruby迭代器
D瓜哥最近想做一个网站,另外,老早就有学习一门动态语言的想法,满足着两个条件的编程语言中,Ruby.Python是最合适的两种语言.现在Ruby on Rails如日中天,光芒万丈!所以,就选定了Ru ...
- Python Iterables Iterators Generators
container 某些对象包含其它对象的引用,这个包含其它对象引用的对象叫容器.例如list可以包含int对象,或者由其它数据类型(或数据结构)的对象组成一个list. 对其他对象的引用是容器值的一 ...
- STL基础--迭代器和算法
1 迭代器 Iterators 5种迭代器类型 随机访问迭代器: vector, deque, array // 允许的操作 vector<int> itr; itr = itr + 5; ...
- Python之可迭代对象、迭代器、生成器
在使用Python的过程中,很容易混淆如下几个关联的概念: 1.容器(container) 2.可迭代对象(Iterable) 3.迭代器(Iterator) 4.生成器(generator) 5.生 ...
- python基础-8迭代器(iter)和生成器(yield)
一 生成器 从Python2.2起,生成器提供了一种简洁的方式帮助返回列表元素的函数来完成简单和有效的代码. 它基于yield指令,允许停止函数并立即返回结果.此函数保存其执行上下文,如果需要,可立即 ...
- python面试大全
问题一:以下的代码的输出将是什么? 说出你的答案并解释. class Parent(object): x = 1 class Child1(Parent): pass class Child2(Par ...
- Python全栈之路8--迭代器(iter)和生成器(yield)
一.生成器( iter ) 从Python2.2起,生成器提供了一种简洁的方式帮助返回列表元素的函数来完成简单和有效的代码. 它基于yield指令,允许停止函数并立即返回结果.此函数保存其执行上下文, ...
- [pyhton]python内建方法
撸一遍python的内建方法 这样做的好处就是:我如果要完成一个功能的时候,如果能用内建方法完成,就用内建方法.这样可以提高效率,同时使自己的代码更加优雅.哎呦?那岂不是撸完就是python高手了?我 ...
随机推荐
- windows迁移linux问题集锦[ZZ]
http://blog.csdn.net/m_star_jy_sy/article/details/8482202 1)‘_wcsicmp’在此作用域中尚未声明 #ifdef WIN32#define ...
- IIS怎么设置本地域名解析(本地域名测试配置)
对于IIS相信大家都不陌生,可以用来作为网站服务器,可以解析网站内容,访问时可以用端口的方式访问,也可以用域名的方式访问.下面我就介绍一下,怎么在本地用域名的方式访问,怎么用IIS进行本地域名解析. ...
- Html内容超出标记宽度后自动隐藏
我们在显示长文本时,往往需要去在C#端去截取字符,但这绝对不是一个好方面,因为我们的长文本往往都是代HTML标记的,你一个载不好,就会出现乱码问题(出现半个HTML标记),而比较好的作法就是通过CSS ...
- Unix/Linux环境C编程入门教程(4) Debian Linux环境搭建
Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 1.广义的Debian是指一个致力于创建自由操作系统的合作组织及其作品,由于Deb ...
- Oracle Spatial-元数据及SDO_GEOMETRY
一.空间表的元数据 将表的SDO_GEOMETRY列的所有对象作为一个空间层.Spatial需要对所有空间对象进行验证.创建索引和查询.此时需要为图层指定适当的元数据,该数据包含如下信息:维度.维度边 ...
- [Leetcode][Python]22: Generate Parentheses
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 22: Generate Parentheseshttps://oj.leet ...
- javascript数组排序-----1
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 城市平乱(Bellman)
城市平乱 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市 ...
- SPOJ 3267 求区间不同数的个数
题意:给定一个数列,每次查询一个区间不同数的个数. 做法:离线+BIT维护.将查询按右端点排序.从左到右扫,如果该数之前出现过,则将之前出现过的位置相应删除:当前位置则添加1.这样做就保证每次扫描到的 ...
- Pro Android学习笔记(十一):了解Intent(中)
Intent的构成 Intent能够带有action,data(由URI表达),extra data(key/value map,键值对),指定的类名(成为component name).一个inte ...