文档章节

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
粉丝 12
博文 163
码字总数 137779
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring-boot | 日志

引言 好久不见,都还好吗? 大家都知道,我一般都是带来实用的东西,这次也一样,我们来试试项目开发中的日志处理。 理论知识 1、为什么要用日志?你是否因为项目出现问题,查找日志文件定位...

成都_小冯同学
18分钟前
0
0
dubbo下的补偿实现(一)

背景 由于前面几篇文章涉及的问题 分布式事务的思考 在我们微服务的场景下 各种本地事务都没有办法控制的很好。 A服务调用B服务 当B服务成功提交之后 A发生了异常 这种情况下要如何处理呢??...

Mr_Qi
26分钟前
2
0
HTML显示json字符串并且进行格式化

通过pre标签进行格式化展示,使用JSON.stringify()方法转换。 代码如下:   <html> <head> <title>HTML显示json字符串并且进行格式化</title> </head> <body> <p id="show_p">{ "name": "B......

writeademo
47分钟前
0
0
LNMP——php-fpm

php-fpm的pool •vim /usr/local/php/etc/php-fpm.conf //在[global]部分增加include并删除我们之前www池子 • include = etc/php-fpm.d/*.conf • mkdir /usr/local/php/etc/php-fpm.d/ • ......

chencheng-linux
51分钟前
0
0
TensorFlow layers slim 模块搭建cnn对mnist分类,比较bn效果

shape变化 (?, 784)(?, 28, 28, 1)(?, 14, 14, 8)(?, 7, 7, 8)(?, 1, 1, 8)(?, 8)(?, 10) 结果对比,基本上还是有点用的 0.91725457 0.9232 0.9548 0.95530.9177273 0.9234 0....

阿豪boy
54分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部