迭代器
- 迭代器是算法和容器的桥梁
- 迭代器用作访问容器中的元素
- 算法不直接操作容器中的数据,而是通过迭代器间接操作
- 算法和容器独立
- 增加新的算法,无需影响容器的实现
- 增加新的容器,原有的算法也能适用
输入流迭代器和输出流迭代器
输入流迭代器
istream_iterator<T>
- 以输入流(如cin)为参数构造
- 可用*(p++)获得下一个输入的元素
输出流迭代器
ostream_iterator<T>
- 构造时需要提供输出流(如cout)
- 可用(*p++) = x将x输出到输出流
二者都属于适配器
- 适配器是用来为已有对象提供新的接口的对象
- 输入流适配器和输出流适配器为流对象提供了迭代器的接口
例10-2从标准输入读入几个实数,分别将它们的平方输出
//10_2.cpp
#include <iterator>
#include <iostream>
#include <algorithm>
using namespace std;
//求平方的函数
double square(double x) {
return x * x;
}
int main() {
//从标准输入读入若干个实数,分别将它们的平方输出
transform(istream_iterator<double>(cin), istream_iterator<double>(),
ostream_iterator<double>(cout, "\t"), square);
cout << endl;
return 0;
}
迭代器的分类
迭代器支持的操作
- 迭代器是泛化的指针,提供了类似指针的操作(诸如++、*、->运算符)
- 输入迭代器
- 可以用来从序列中读取数据,如输入流迭代器
- 输出迭代器
- 允许向序列中写入数据,如输出流迭代器
- 前向迭代器
- 既是输入迭代器又是输出迭代器,并且可以对序列进行单向的遍历
- 双向迭代器
- 与前向迭代器相似,但是在两个方向上都可以对数据遍历
- 随机访问迭代器
- 也是双向迭代器,但能够在序列中的任意两个位置之间进行跳转,如指针、使用vector的begin()、end()函数得到的迭代器
迭代器的区间
- 两个迭代器表示一个区间:[p1, p2)
- STL算法常以迭代器的区间作为输入,传递输入数据
- 合法的区间
- p1经过n次(n > 0)自增(++)操作后满足p1 == p2
- 区间包含p1,但不包含p2
例10-3 综合运用几种迭代器的示例
程序涉及到输入迭代器、输出迭代器、随机访问迭代器这三个迭代器概念,并且以前两个概念为基础编写了一个通用算法。
//10_3.cpp
#include <algorithm>
#include <iterator>
#include <vector>
#include <iostream>
using namespace std;
//将来自输入迭代器的n个T类型的数值排序,将结果通过输出迭代器result输出
template <class T, class InputIterator, class OutputIterator>
void mySort(InputIterator first, InputIterator last, OutputIterator result) {
//通过输入迭代器将输入数据存入向量容器s中
vector<T> s;
for (;first != last; ++first)
s.push_back(*first);
//对s进行排序,sort函数的参数必须是随机访问迭代器
sort(s.begin(), s.end());
copy(s.begin(), s.end(), result); //将s序列通过输出迭代器输出
}
int main() {
//将s数组的内容排序后输出
double a[5] = { 1.2, 2.4, 0.8, 3.3, 3.2 };
mySort<double>(a, a + 5, ostream_iterator<double>(cout, " "));
cout << endl;
//从标准输入读入若干个整数,将排序后的结果输出
mySort<int>(istream_iterator<int>(cin), istream_iterator<int>(), ostream_iterator<int>(cout, " "));
cout << endl;
return 0;
}
/*
运行结果:
0.8 1.2 2.4 3.2 3.3
2 -4 5 8 -1 3 6 -5
-5 -4 -1 2 3 5 6 8
*/
迭代器的辅助函数
- advance(p, n)
- 对p执行n次自增操作
- distance(first, last)
- 计算两个迭代器first和last的距离,即对first执行多少次“++”操作后能够使得first == last