模板使得算法独立于存储的数据类型,而迭代器使算法独立于使用的容器类型。
迭代器提供了遍历容器中值的通用表示。
每个容器类都定义了相应的迭代器类型。
STL描述了5种迭代器概念:
~输入和输出是相对于程序而言的,来自于容器的信息被视为输入;输出指将信息从程序传递给容器。
~输入迭代器:可以递增,但不能倒退,单向迭代器,单通行,用于只读算法;
~输出迭代器:类似于输入迭代器,单通行,用于只写算法;
~正向迭代器:正向迭代器递增后,仍然可以对前面的迭代器值解除引用,支持读和写;
~双向迭代器:双向迭代器支持正向迭代器的所有特性,还支持两种递减运算符;
~随机访问迭代器:支持双向迭代器的所有特性,同时支持随机访问的操作。
在编写算法时尽可能使用最低要求的迭代器。
常规指针是随机访问迭代器的模型。
STL提供了一些预定义的迭代器(在头文件iterator中声明):
1. ostream_iterator模板(输出迭代器概念的模型)
ostream_iterator< int, char > out_iter( cout, " " ); //是一个适配器类,可以使用cout来显示信息
第一个模板参数指出了被发送给数据流的数据类型,第二个模板参数指出了输出流使用的数据类型;
构造函数的第一个参数指出了使用的输出流,第二个参数是发送给输出流的每个数据项后显示的分隔符。
*out_iter++ = 15; //表示将15和空格组成的字符串发送到cout管理的输出流中。
2. istream_iterator模板(输入迭代器概念的模型)
istream_iterator<int, char> inr_iter(cin);
3. reverse_iterator模板
执行递增操作将导致递减。
vector类成员函数rbegin()和rend()返回指向超尾和第一个元素的反向迭代器。
反向指针先递减再解除引用,从而能够遍历反转概念的容器中的所有元素。
4. 插入迭代器(输出迭代器概念的模型)
insert_iterator模板:
insert_iterator< vector<string> > pit( words, words.begin() ); //words是vector<string>类对象
back_insert_iterator模板:只能用于在尾部快速插入的容器
back_insert_iterator< vector<string> > pit( words); //words是vector<string>类对象
front_insert_iterator模板:只能用于在起始位置做快速插入的容器
front_insert_iterator< vector<string> > pit( words); //words是vector<string>类对象