文档章节

STL: std::iterator_traits.

SHIHUAMarryMe
 SHIHUAMarryMe
发布于 2016/08/14 22:23
字数 1116
阅读 27
收藏 0

Iterator(迭代器)是一种 "能够迭代某序列内所有元素"的对象,可通过改编自寻常pointer的一致接口来完成工作。

Iterator奉行一个纯抽象的概念: 任何东西,只要行为类似iterator,就是一种Iterator。但是不同的迭代器拥有不同的能力。

废话不多了说我们来了解一下迭代器的分类.

Output-iterator:

Output-iterator允许一步一步前行并搭配write动作.因此你可以通过Output-iterator对区间内的元素进行挨个赋值,但是不能使用Output-iterator对同一区间迭代2次.

其支持的操作:

*iter = val : 将val写到迭代器所指位置.

++iter : 向前步进,返回新位置(也可能只是个无用的操作,参考std::ostream_iterator).

iter++ : 向前步进,通常情况下返回旧位置(也可能只是个无用的操作,参考std::ostream_iterator).

标准库提供了std::ostream_iterator是典型的 Output-iterator!

 

           我们常用的所有迭代器都具有Input-iterator的能力,而且更强.

Input-iterator:

Input-iterator迭代器只能一次一个以前进方向读取元素,按此顺序一个个返回元素值。

其支持的操作:

*iter :  返回读取到的值.

iter->member : 返回读取的元素的成员.

++iter : 向前步进(返回新位置).

iter++ : 向前步进(发挥旧位置).

iter1 == iter2 : 判断2个迭代器是否相等.

iter1 != iter2 : 判断2个迭代器是否不相等.

TYPE(iter) : 拷贝构造函数.

其中标准库对于Input-iterator的 ==和!= 没有要求: 如果两个input-iterator都不是尾后迭代器,且指向不同位置,他们的比较结果会不相等.

其中标准库中的std::istream_iterator是典型的Input-iterator!

 

Forward-iterator:

Forward-iterator提供保证: 如果两个Forward-iterator都不是尾后迭代器,且指向不同的位置,它们的比较结果一定不会相等!

其支持的操作:

*iter : 返回读取到的值.

iter->member : 访问读取到的元素的成员(如果有的话).

++iter : 向前步进(返回新位置).

iter++ : 向前步进(返回旧位置).

iter1 == iter2 : 判断2个迭代器是否相等.

iter1 != iter2 : 判断2个迭代器时候不相等.

TYPE() : 通过默认构造函数创建一个迭代器.

TYPE(iter) : 迭代器的拷贝构造函数.

iter1 = iter2 : 迭代器的拷贝赋值运算符.

两个Forward-iterator如果指向同一个元素,调用 == 会得到true, 如果两者同时递增会再次指向同一个元素.

其中标准库中的std::forward_list是典型的提供了Forward-iterator的代表.

 

Bidirectional-iterator:

Bidirectional-iterator是在Forward_iterator的基础上增加了回头的能力.换句话来说,它支持递减操作,可以一步一步后退.

其支持的操作:

*iter : 返回读取到的值.

iter->member : 访问读取到的元素的成员(如果有的话).

++iter : 向前步进(返回新位置).

iter++ : 向前步进(返回旧位置).

iter1 == iter2 : 判断2个迭代器是否相等.

iter1 != iter2 : 判断2个迭代器时候不相等.

TYPE() : 通过默认构造函数创建一个迭代器.

TYPE(iter) : 迭代器的拷贝构造函数.

iter1 = iter2 : 迭代器的拷贝赋值运算符.

--iter : 步退返回新位置.

iter-- : 步退返回旧位置.

 

Random-access-iterator:

Random-access-iterator迭代器在Bidirectional-iterator的基础上增加了随机访问的能力。因此它必须提供iterator算术运算。

其支持的操作:

*iter : 返回读取到的值.

iter->member : 访问读取到的元素的成员(如果有的话).

++iter : 向前步进(返回新位置).

iter++ : 向前步进(返回旧位置).

iter1 == iter2 : 判断2个迭代器是否相等.

iter1 != iter2 : 判断2个迭代器时候不相等.

TYPE() : 通过默认构造函数创建一个迭代器.

TYPE(iter) : 迭代器的拷贝构造函数.

iter1 = iter2 : 迭代器的拷贝赋值运算符.

--iter : 步退返回新位置.

iter-- : 步退返回旧位置.

iter[n] : 访问索引位置为n的元素(针对寻常的 C-Style array).

iter+n : 将迭代器向前前进n个位置.

n+iter : 将迭代器向前前进n个位置.

iter - n: 将迭代器后退n个位置.

iter1 - iter2 : 返回2个迭代器之间的位置.

iter1 < iter2 : 判断iter1是否在iter2之前.

iter1 > iter2 :判断iter1是否在iter2之后.

iter1 <= iter2 :判断iter1是否不在iter2之后.

iter1 >= iter2 : 判断iter1是否不在iter2之前.

© 著作权归作者所有

共有 人打赏支持
SHIHUAMarryMe
粉丝 13
博文 162
码字总数 136638
作品 0
武汉
程序员
effective C++ 条款 42:了解typename的双重意义

template声明式中,class和typename这两个关键字意义完全相同 template<class T> class Widget; template<typename T> class Widget; 有时候你一定要用typename, 可以在template中指涉的两种......

西昆仑
2012/02/15
0
0
C++箴言:理解 typename 的两个含义

  问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同? template<class T> class Widget; // uses "class"template<typename T> class Widget; // uses ......

不必在乎朕是谁
2012/10/04
0
0
篮子、水果和鸡蛋——关于C++的模板偏特化和萃取编程技法

最近在读《STL源码剖析》。读这本书的时候发现自己的C++的知识其实是非常匮乏的。 从大学的C++教材上学到一些C++基本的语法、内存管理、继承、多态等方面的基础知识。这些只是是一棵大树的根...

costaxu
2012/12/22
0
0
学习 LLVM(10) ilist.h

位于 llvm/include/llvm/[[ADT]]/ilist.h == 简介 == 主要实现侵入式链接列表模板(Intrusive Linked List Template),实际是双向的列表。 主要类是 iplist, ilist 用于实现 列表模板。 其它是...

刘军兴
2012/02/29
0
3

没有更多内容

加载失败,请刷新页面

加载更多

初级开发-编程题

` public static void main(String[] args) { System.out.println(changeStrToUpperCase("user_name_abc")); System.out.println(changeStrToLowerCase(changeStrToUpperCase("user_name_abc......

小池仔
今天
8
0
现场看路演了!

HiBlock
昨天
19
0
Rabbit MQ基本概念介绍

RabbitMQ介绍 • RabbitMQ是一个消息中间件,是一个很好用的消息队列框架。 • ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的s...

寰宇01
昨天
12
0
官方精简版Windows10:微软自己都看不过去了

微软宣布,该公司正在寻求解决方案,以减轻企业客户的Windows 10规模。该公司声称,企业客户下载整个Windows 10文件以更新设备既费钱又费时。 微软宣布,该公司正在寻求解决方案,以减轻企业...

linux-tao
昨天
20
0
TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部