迭代器
-
迭代器是算法和容器的桥梁
-
迭代器用作访问容器中的元素
-
算法不直接操作容器中的数据,而是通过迭代器间接操作
-
-
算法和容器独立
-
增加新的算法,无需影响容器的实现
-
增加新的容器,原有的算法也能适用
-
输入流迭代器和输出流迭代器
-
输入流迭代器
istream_iterator<T>
-
以输入流(如cin)为参数构造
-
可用*(p++)获得下一个输入的元素
-
-
输出流迭代器
ostream_iterator<T>
-
构造时需要提供输出流(如cout)
-
可用(*p++) = x将x输出到输出流
-
-
二者都属于适配器
-
适配器是用来为已有对象提供新的接口的对象
-
输入流适配器和输出流适配器为流对象提供了迭代器的接口
-
例10-2从标准输入读入几个实数,分别将它们的平方输出
#include <iostream>
#include <iterator>
#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;
}
迭代器的辅助函数
-
advance(p, n)
-
对p执行n次自增操作
-
-
distance(first, last)
-
计算两个迭代器first和last的距离,即对first执行多少次“++”操作后能够使得first == last
-