1、迭代器类别
output迭代器 |
只写,不读,单遍扫描,只能递增 |
ostream、insert |
input迭代器 |
只读,不写,单遍扫描,只能递增 |
istream |
forward迭代器 |
可读写,多遍扫描,只能递增 |
forward_list、unordered containers |
bidirectional迭代器 |
可读写,多遍扫描,可递增递减 |
list、set、multiset、map、multimap |
random-access迭代器 |
可读写,多遍扫描,支持全部迭代器运算 |
array、vector、deque、string、c-style array |
2、output迭代器
表达式 |
效果 |
*iter = val |
将val写只迭代器所指位置 |
++iter |
向前步进(step forward),返回新位置 |
iter++ |
向前步进(step forward),返回旧位置 |
TYPE(iter) |
复制迭代器(copy构造函数) |
3、input迭代器
表达式 |
效果 |
*iter |
读取实际元素 |
iter->member |
读取实际元素的成员(如果有的话) |
++iter |
向前步进,返回新位置 |
iter++ |
向前步进,返回旧位置 |
iter1 == iter2 |
判断两个迭代器是否相等 |
iter1 != iter2 |
判断两个迭代器是否不等 |
TYPE(iter) |
复制迭代器(copy构造函数) |
- input迭代器只能读取元素一次,如果你复制input迭代器,并令原input迭代器和新产生的拷贝都向前读取,可能会遍历到不同的值
4、forward迭代器
表达式 |
效果 |
*iter |
读取实际元素 |
iter->member |
读取实际元素的成员(如果有的话) |
++iter |
向前步进,返回新位置 |
iter++ |
向前步进,返回旧位置 |
iter1 == iter2 |
判断两个迭代器是否相等 |
iter1 != iter2 |
判断两个迭代器是否不等 |
TYPE() |
创建迭代器(default构造函数) |
TYPE(iter) |
复制迭代器(copy构造函数) |
iter1 = iter2 |
对迭代器赋值(assign) |
- 和input迭代器不同的是,两个forward迭代器如果指向同一元素,operator==会获得true,如果两者都递增,会再次指向同一个元素。
5、bidirectional迭代器
表达式 |
效果 |
*iter |
读取实际元素 |
iter->member |
读取实际元素的成员(如果有的话) |
++iter |
向前步进,返回新位置 |
iter++ |
向前步进,返回旧位置 |
–iter |
步退,返回新位置 |
iter– |
步退,返回旧位置 |
iter1 == iter2 |
判断两个迭代器是否相等 |
iter1 != iter2 |
判断两个迭代器是否不等 |
TYPE() |
创建迭代器(default构造函数) |
TYPE(iter) |
复制迭代器(copy构造函数) |
iter1 = iter2 |
对迭代器赋值(assign) |
6、random-access迭代器
表达式 |
效果 |
iter[n] |
访问索引位置为n的元素 |
iter += n |
前进n个元素(如果n是负数,则改为回退) |
iter -= n |
回退n个元素(如果n是负数,则改为前进) |
iter + n |
返回iter之后的第n个元素 |
iter - n |
返回iter之前的第n个元素 |
iter1 - iter2 |
返回iter1和iter2之间的距离 |
iter1 < iter2 |
判断iter1是否在iter2之前 |
iter1 > iter2 |
判断iter1是否在iter2之后 |
iter1 <= iter2 |
判断iter1是否不在iter2之后 |
iter1 >= iter2 |
判断iter1是否不在iter2之前 |
7、vector迭代器的递增和递减
- 迭代器的递增和递减有个奇怪的问题。一般而言你可以递增或递减临时性迭代器,但对于array、vector和string就不行(在某些编译平台上)。
vector<int> coll;
if (coll.size() > 1) {
sort(++coll.begin(), coll.end());
}
- 编译++coll.begin()可能会失败,实际情况取决于平台。但如果你换用deque取代vector,就可以通过编译。
- vector、array和string的迭代器通常被实现为寻常pointer,而C++不允许你修改任何基础类型(包括pointer)的临时值,但对于struct和Class则允许。
8、迭代器相关辅助函数
- c++标准库为迭代器提供了一些辅助函数:advance()、next()、prev()、distance()和iter_swap()。前四者提供给所有迭代器一些“原本只有random access迭代器才有”的能力。最后一个允许你交换两个迭代器的value。
void advance (InputIterator& pos, Dist n) |
令名为pos的input迭代器前进(或后退)n个元素 |
ForwardIterator next (FowardIterator pos) |
令forward迭代器pos前进1个位置 |
ForwardIterator next (ForwardIterator pos, Dist n) |
令forward迭代器pos前进n个位置 |
BidirectionalIterator prev (BidirectionalIterator pos) |
令bidirectional迭代器pos后退1个位置 |
BidirectionalIterator prev (BidirectionalIterator pos, Dist n) |
令bidirectional迭代器pos后退n个位置 |
Dist distance (InputIterator pos1, InputIterator pos2) |
返回两个input迭代器pos1和pos2之间的距离 |
void iter_swap (ForwardIterator1 pos1, ForwardIterator2 pos2) |
交换迭代器pos1和pos2所指的值 |
9、迭代器适配器
9.1 reverse迭代器
9.2 insert迭代器
9.3 stream迭代器
9.4 move迭代器