【boost学习笔记】五种Iterator
来源:互联网 发布:决战武林翅膀进阶数据 编辑:程序博客网 时间:2024/06/15 22:17
五种Iterator为:
- Input Iterator
- Output Iterator
- Forward Iterator
- Bidirectional Iterator
- Radom Access Iterator
一、Input Iterator
- 用于只读,并且只能读一次。重复读没有定义。x=*it,不能再次x=*it。例如:istream_iterator。重复读有危险,应该在x=*it之后,立即++it,并且测试it!=end()。例如是否读到了流的末尾。即:单遍历(Single pass)
- 定义了operator++,但是同一时间只能使用一个iterator,不能把旧的iterator暂存。例如old=it; ++it,那么old就无意义。没有定义operator--。
二、Output Iterator
- 用于只写,并且只能写一次。重复写则可能包含危险。*it=x。如果再次*it=x,则该语句可能是个危险操作。例如ostream_iterator。
- 定义了operator++(同Input Iterator)。
三、Forward Iteraotr
- 可以只读或只写,或者包含两者。可以进行多次读写。但是只定义了operator++。
- 是多遍历(Muti pass),也就是可以暂存旧的Iteraotr。old=it有意义。++it之后,old还有效。++old也有效。常用于列表、数组等容器。
- 具有同一性(Identity):Iterator p==q,那么*p==*q。
四、Bidirectional Iterator
- 同Forward Iterator。还定义了operator--。
- 值得注意:Iterator it=end(),--it必须是有意义。也就是end()返回的iterator必须是该容器的“尾节点”,不能是一个“空”iterator。例如数组类array.end()不能返回 NULL。因为许多算法需要从end()开始进行operator--(例如:反向拷贝)。Forward Iterator没有此限制,可以用一个“空”iterator作为end()。
五、Radom Access Iterator
除了含有Bidirectional Iteraotr所有的概念外,还有如下:
- 加减法:it+n、it-n
- 两个Iterator相减:int n = it2-it1
- 下标:it[n]
- 前后次序关系:it1
也就是定义了如上几个操作符。可以看做C语言的内存指针p。虽然Bidirectional Iterator能够模拟出it+n的操作,但效率太低。
五个Iterator的关系图:
六、iterator_category的作用:
所有的自定义Iterator类都必须从以上五个中的一个继承,就自动包含了iterator_category这个typedef重定义的类型。主要用于一些算法的优化重载函数中。例如:
template<class InputIteratr, class Distance>advance(InputIterator it, Distance n){__advance(it, n, iterator_traits::iterator_category()); }
iterator_traits<...>是为了适配原生指针(使用iterator_traits
- 【boost学习笔记】五种Iterator
- Java基础学习笔记(五)Iterator
- C++学习笔记(五)迭代器iterator
- Boost学习笔记之五 bind
- Boost学习笔记(五)---宏介绍BOOST_TYPEOF和BOOST_AUTO
- stl 五种iterator
- Iterator Pattern 学习笔记
- 学习笔记---------------iterator
- ES6学习笔记:Iterator
- 五种iterator的类别
- Boost.Python学习笔记
- Boost学习笔记 BOOST_STATIC_ASSERT
- Boost学习笔记 operators
- Boost.Python 学习笔记
- Boost python 学习笔记
- Boost学习笔记-tokenizer
- Boost学习笔记-bind
- Boost python 学习笔记
- 程序员是这样炼成的(16)-技术和工作都是浮云
- jquery学习之常用方法
- 网络设备osi参考模型分类层次
- Tomcat项目部署
- SQL 查询的效率
- 【boost学习笔记】五种Iterator
- stl中容器string vector list deque 比较
- IRC工具
- stl容器学习总结
- 测试随感
- 初识Android开发
- TCP/IP memo 1: MTU、路径MTU、路径MTU的发现机制
- ubuntu下android开发环境搭建
- 关于一个java 进制转换的swing