STL: std::iterator_traits.

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之前.

转载于:https://my.oschina.net/SHIHUAMarryMe/blog/732540

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值