第9章 STL迭代器

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迭代器

猜你喜欢

转载自blog.csdn.net/weixin_42205011/article/details/87707148