C++迭代器iterator
来源:互联网 发布:2016淘宝店铺运营方案 编辑:程序博客网 时间:2024/05/09 10:17
1. 迭代器Iterator
- 用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
- 一般仅用于底层聚合支持类,如STL的list、vector、stack等容器类及ostream_iterator等扩展iterator。
- 每种数据数据容器都可以定义自己的迭代器类型。
- 使用迭代器可以读取容器中的每一个元素。
- const_iterator 迭代器只能读取容器中的元素,但是不能修改。
- 双向容器例如vector的迭代器不能使用“<”,">"这样的比较运算符,只能用“!=”或者“==”。
- 注意vector<int>::const_iterator 和const vector<int>::iterator的区别。
- 迭代器除了可以进行“++”,“--”操作,还可以进行“+n”,"-n"操作
2. 迭代器的分类
根据STL中的分类,iterator包括:
Input Iterator:只能单步向前迭代元素,不允许修改由该类迭代器引用的元素。
Output Iterator:该类迭代器和Input Iterator极其相似,也只能单步向前迭代元素,不同的是该类迭代器对元素只有写的权力。
Forward Iterator:该类迭代器可以在一个正确的区间中进行读写操作,它拥有Input Iterator的所有特性,和Output Iterator的部分特性,以及单步向前迭代元素的能力。
Bidirectional Iterator:该类迭代器是在Forward Iterator的基础上提供了单步向后迭代元素的能力。
Random Access Iterator:该类迭代器能完成上面所有迭代器的工作,它自己独有的特性就是可以像指针那样进行算术计算,而不是仅仅只有单步向前或向后迭代。
以上五类迭代器的从属关系如下:
其中箭头A→B表示,A是B的强化类型,这也说明了如果一个算法要求B,那么A也可以应用于其中。
图1. 五种迭代器之间的关系
- vector 和deque提供的是RandomAccessIterator.
- list提供的是BidirectionalIterator.
- set和map提供的 iterators是 ForwardIterator.
- 说明:每种迭代器均可进行包括表中前一种迭代器可进行的操作。
迭代器操作 说明
(1)所有迭代器
p++ 后置自增迭代器
++p 前置自增迭代器
(2)输入迭代器
*p 复引用迭代器,作为右值
p=p1 将一个迭代器赋给另一个迭代器
p==p1 比较迭代器的相等性
p!=p1 比较迭代器的不等性
(3)输出迭代器
*p 复引用迭代器,作为左值
p=p1 将一个迭代器赋给另一个迭代器
(4)正向迭代器
提供输入输出迭代器的所有功能
(5)双向迭代器
--p 前置自减迭代器
p-- 后置自减迭代器
(6)随机迭代器
p+=i 将迭代器递增i位
p-=i 将迭代器递减i位
p+i 在p位加i位后的迭代器
p-i 在p位减i位后的迭代器
p[i] 返回p位元素偏离i位的元素引用
p<p1 如果迭代器p的位置在p1前,返回true,否则返回false
p<=p1 p的位置在p1的前面或同一位置时返回true,否则返回false
p>p1 如果迭代器p的位置在p1后,返回true,否则返回false
p>=p1 p的位置在p1的后面或同一位置时返回true,否则返回false
只有顺序容器和关联容器支持迭代器遍历,各容器支持的迭代器的类别如下:
容器 支持的迭代器类别 容器 支持的迭代器类别 容器 支持的迭代器类别
vector 随机访问 deque 随机访问 list 双向
set 双向 multiset 双向 map 双向
multimap 双向 stack 不支持 queue 不支持
priority_queue 不支持
- C++vector 迭代器iterator
- 【c++】迭代器iterator
- C++Iterator Categories(迭代器种类)
- c ++ iterator
- [C++]iterator
- C++Primer——迭代器iterator
- C++primer 3.3 标准库 迭代器 iterator
- C++:标准程序库-STL迭代器Iterator
- Iterator(迭代器)
- Iterator-迭代器
- 迭代器 iterator
- Iterator迭代器
- 迭代器Iterator
- Iterator : 迭代器
- Iterator : 迭代器
- 迭代器Iterator
- 迭代器iterator
- Iterator迭代器
- B1029. 旧键盘(20)
- Android 集成华为推送
- 出租车数据处理过程
- gitbook生成静态blog通过travis发布到github托管
- java web个人博客开发(二产品设计)
- C++迭代器iterator
- IntelliJ IDEA 2016破解码
- 105. Construct Binary Tree from Preorder and Inorder Traversal
- 浅析C++之指针和const限定符号
- js面向对象原型属性和实例属性
- 2017湖南多校第一场-L(1011): Languages
- TransferQueue
- GreenDao2 配置混淆错误解决
- windows server2012 IIS服务器上发布网站挖坑记