《C++标准程序库》——STL迭代器
1 头文件
所有容器有含有其各自的迭代器型别(iterator types),所以当你使用一般的容器迭代器时,并不需要含入专门的头文件。不过有几种特别的迭代器,例如逆向迭代器,被定义于<iterator>中。
2 迭代器类型
迭代器共分为五种,分别为: Input iterator、Output iterator、Forward iterator、Bidirectional iterator、Random access iterator。
2.1 Input(输入)迭代器
只能一次一个向前读取元素,按此顺序一个个传回元素值。表2.1列出了Input迭代器的各种操作行为。Input迭代器只能读取元素一次,如果你复制Input迭代器,并使原Input迭代器与新产生的副本都向前读取,可能会遍历到不同的值。纯粹Input迭代器的一个典型例子就是“从标准输入装置(通常为键盘)读取数据”的迭代器。
-
表达式
效果
*iter
读取实际元素
iter->member
读取实际元素的成员(如果有的话)
++iter
向前步进(传回新位置)
iter++
向前步进(传回旧位置)
iter1 == iter2
判断两个迭代器是否相同
iter1 != iter2
判断两个迭代器是否不相等
TYPE(iter)
复制迭代器(copy 构造函数)
2.2 Output(输出)迭代器
Output迭代器和Input迭代器相反,其作用是将元素值一个个写入。表2.2列出Output迭代器的有效操作。operator*只有在赋值语句的左手边才有效。Output迭代器无需比较(comparison)操作。你无法检验Output迭代器是否有效,或“写入动作”是否成功。你唯一可以做的就是写入、写入、再写入。
-
表达式
效果
*iter = value
将元素写入到迭代器所指位置
++iter
向前步进(传回新位置)
iter++
向前步进(传回旧位置)
TYPE(iter)
复制迭代器(copy 构造函数)
2.3 Forward(前向)迭代器
Forward迭代器是Input迭代器与Output迭代器的结合,具有Input迭代器的全部功能和Output迭代器的大部分功能。表2.3总结了Forward迭代器的所有操作。Forward迭代器能多次指向同一群集中的同一元素,并能多次处理同一元素。
-
表达式
效果
*iter
存取实际元素
iter->member
存取实际元素的成员
++iter
向前步进(传回新位置)
iter++
向前步进(传回旧位置)
iter1 == iter2
判断两个迭代器是否相同
iter1 != iter2
判断两个迭代器是否不相等
TYPE()
产生迭代器(default构造函数)
TYPE(iter)
复制迭代器(copy构造函数)
iter1 == iter2
复制
2.4 Bidirectional(双向)迭代器
Bidirectional(双向)迭代器在Forward迭代器的基础上增加了回头遍历的能力。换言之,它支持递减操作符,用以一步一步的后退操作。
2.5 Random Access(随机存取)迭代器
Random Access迭代器在Bidirectional迭代器的基础上再增加随机存取能力。因此它必须提供“迭代器算数运算”(和一般指针“指针算术运算”相当)。也就是说,它能加减某个偏移量、能处理距离(differences)问题,并运用诸如<和>的相互关系操作符进行比较。以下对象和型别支持Random Access迭代器:
-
可随机存取的容器(vector, deque)
-
strings(字符串,string,wstring)
-
一般array(指针)
3 迭代器相关辅助函数
3.1 advance() 令迭代器前进
3.2 distance() 处理迭代器之间的距离
3.3 iter_swap() 交换两个迭代器所指内容
4 迭代器配接器
4.1 Reverse(逆向迭代器)
逆向迭代器重新定义递增运算和递减运算,使其行为正好倒置。成员函数rbegin()和rend()各传回一个Reverse迭代器,和begin()和end()类似,共同定义一个半开区间。用正向迭代器可以直接构造一个逆向迭代器,但是构造之后会出现“错位”现象。原因在逆向迭代器要保证半开区间不会越界,可调用逆向迭代器的base()函数,保证转换值的正确性(迭代器移了一位)。
4.2 Insert(安插型)迭代器
Insert迭代器,也称为inserters,用来将“赋值新值”操作转换为“安插新值”操作。通过这种迭代器,算法可以执行安插(insert)行为而非覆盖(overwrite)行为。所有Insert迭代器都隶属于Output迭代器类型。所以它只提供赋值(assign)新值的能力。表4.2.1列出Insert迭代器的所有操作函数。
-
表达式
效果
*iter
无实际操作(传回iter)
iter = value
安插value
++iter
无实际操作(传回iter)
iter++
无实际操作(传回iter)
C++标准程序库提供三种Insert迭代器:back inserters, front inserters, general inserters。它们的区别在于插入位置。事实上它们各自调用所属容器中不同的成员函数。所以Insert迭代器初始化时要清楚知道自己所属的容器是哪一种。表4.2.2列出Insert迭代器的种类。
-
名称
Class
其所调用的函数
生成函数
Back inserter
back_inserter_iterator
push_back(value)
back_inserter(cont)
Front inserter
front_insert_iterator
push_front(value)
front_inserter(cont)
General inserter
insert_iterator
insert(pos, value)
inserter(cont, pos)
4.3 Stream(流)迭代器
Stream迭代器是一种迭代器配接器,通过它,你可以把stream当成算法的原点和终点。更明确的说,一个istream迭代器可以用来从input stream中读元素,而一个ostream迭代器可以用来对output stream写入元素。
Stream迭代器的一种特殊形式是所谓的stream缓冲区迭代器,用来对stream缓冲区进行直接读取和写入操作。
Ostream迭代器
ostream迭代器 可以被赋予的值写入output stream中。下表列出ostream迭代器的各项操作
-
算式
效果
ostream_iterator<T>(ostream)
为ostream产生一个ostream迭代器
ostream_iterator<T>(ostream, delim)
为ostream产生一个ostream迭代器,各元素间以delim为分隔符(请注意,delim的型别是const char*)
*iter
无实际操作(传回iter)
iter = value
将value写到ostream,像这样:ostream<<value。其后再输出一个delim(分隔符;如有定义的话)
++iter
无实际操作(传回iter)
iter++
无实际操作(传回iter)
Istream迭代器
istream迭代器是ostream迭代器的拍档,用来从input stream读取元素。透过istream迭代器,算法可以从stream中直接读取数据。istream迭代器的各项操作。
-
算式
效果
istream_iterator<T>()
产生一个end-of-stream迭代器
istream_iterator<T>(istream)
为istream产生的一个迭代器(可能立即去读第一个元素)
*iter
传回先前读取的值(如果构造函数并未立刻读取第一个元素值,则本式执行读取任务)
iter->member
传回先前读取的元素的成员(如果有的话)
++iter
读取下一个元素,并传回其位置
iter++
读取下一个元素,并传回迭代器指向前一个元素
iter1 == iter2
检查iter1和iter2是否相等
iter1 != iter2
检查iter1和iter2是否不相等
参考资料:《C++标准程序库》
本文完
转载请表明出处,谢谢
2011-06-25