ostream_iterator输出流迭代器
ostream_iterator是流迭代器,用STL的话说,该模板是一个输出流迭代器的一个模型,它也是一个适配器(adapter)——一个类或函数,可以将一些其他接口转换为STL使用的接口。使用时要添加< iterator>头文件,构造函数第一个参数为输出流对象,可以是cout,也可以是文件等;第二个参数是分隔符,放到输出流的时候,每放一个元素,就后面添加一个分隔符。
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ostream_iterator<int, char> out_iter(cout, "#");
vector<int> tmp;
int num;
while (cin >> num)
tmp.push_back(num);
copy(tmp.begin(), tmp.end(), out_iter);
return 0;
}
out_iter迭代器现在是一个接口,让你能够使用cout来显示信息。第一个模板参数(这里为int)指出了被发送给输出流的数据类型;第二个模板参数(这里为char)指出了输出流使用的字符类型(另一个可能的值是wchr_t)。构造函数的第一个参数(这里为cout)指出了要使用的输出流;最后一个字符串参数是在发送给输出流的每个数据项后显示的分隔符。
可以这样使用流迭代器:
*cout_iter++ = 15; // works like cout << 15 << " ";
对于常规指针,这意味着将15赋给指针指向的位置,然后将指针加1,。但对于该ostream_iterator,这意味着将15和空格组成的字符串发送到cout管理的输出流中,并为下一个输出操作做好了准备。
ostream_iterator用于简化过程,常常在调用函数产生了新的容器时,传入ostream_iterator参量来对新容器直接输出,不需要中间变量。可以写成如下样式
merge(arg1.begin(),arg1.end(),arg2.begin(),arg2.end(),ostream_iterator<int>(cout," "));
注意:如果是自己编写的类或结构体,还需要重载<<运算符。
istream_iterator输入流迭代器
iterator头文件还定义了一个istream_iterator模板,使istream输入可用作迭代器接口。它是一个输入迭代器概念的模型,可以使用两个istream_iterator对象来定义copy()的输入范围:
copy(istream_iterator<int, char>(cin), istream_iterator<int, char>(), dice.begin());
与ostream_iterator相似,istream_iterator也使用两个模板参数。第一个参数指出要读取的数据类型,第二个参数输入流使用的字符类型。使用构造函数参数cin意味着使用有cin管理的输入流,省略构造函数参数表示输入失败,因此上述代码从输入流中读取,直到文件结尾、类型不匹配或出现其他输入故障为止。