istream_iterator 用来读取输入流,ostream_iterator 用于写输出流;
其构造函数如下:
istream_iterator<T> in(strm) //从输入流strm 创建读取T类型对象的istream_iterator 对象;
istream_iterator<T> in; istream_iterator 对象的超出末端迭代器;
ostream_iterator<T> out(strm) //创建将T类型对象写道strm流的ostream_iterator 对象;
osteam_iterator<T> out(strm,delim) //创建将T类型对象写入strm流的ostream_iterator 对象,在写入过程中,以delim 为元素分隔符,delim 是C风格字符串;
eg1 从标准输入读取一系列整数,存放在一个vector 容器中,再输出该容器的内容.
int main(int argc, char* argv[])
{
istream_iterator<int> in_iter(cin);
istream_iterator<int> end_iter;
vector<int> ivec(in_iter,end_iter);
ostream_iterator<int> out_iter(cout,"\n");
for(vector<int>::iterator i = ivec.begin() ;i!= ivec.end() ; ++i)
{
*out_iter++ = *i;
}
return 0;
}
eg2. 读取一个文件的内容,使用copy 算法将文件内容输出到标准输出
int main(int argc, char* argv[])
{
fstream fin;
fin.open("C:\\Users\\lenovo\\Desktop\\log.txt",ios::in);
istream_iterator<string> in_iter(fin),end_iter;
ostream_iterator<string> out_iter(cout,"\n");
copy(in_iter,end_iter,out_iter);
fin.close();
return 0;
}
eg3.
使用istream_iterator 对象从标准输入读入一系列整数,使用ostream_iterator 对象将其中的奇数写到一个文件,偶数写到另一个文件
#include <iostream>
#include <iterator>
#include <algorithm>
#include <fstream>
using namespace std;
int main(int argc,char* argv[])
{
istream_iterator<int> in_iter(cin),end_iter;
fstream file1,file2;
file1.open("1.txt",ios::out);
file2.open("2.txt",ios::out);
ostream_iterator<int> out1(file1,"\n");
ostream_iterator<int> out2(file2,"\n");
copy_if(in_iter,end_iter,out1,[](int i){return !(i%2 == 0);});
copy_if(in_iter,end_iter,out2,[](int i){return i%2 == 0;});
return 0;
}
ps. 目前上面eg3的程序还有bug ,copy_if 连着两次调用,第二次调用没有起到期望的效果
上面联系两次调用copy_if() 出现问题,其原因是:
An InputIterator
is an Iterator
that can read from the pointed-to element. InputIterator
s only guarantee validity for single pass algorithms: once an InputIterator
i has been incremented, all copies of its previous value may be invalidated.
解决办法是先将标准输入的内容保存在容器中:
istream_iterator<int> in_iter(cin),end_iter;
vector<int> ivec(in_iter,end_iter);
fstream file1,file2;
file1.open("1.txt",ios::out);
file2.open("2.txt",ios::out);
ostream_iterator<int> out1(file1,"\n");
ostream_iterator<int> out2(file2,"\n");
copy_if(ivec.begin(),ivec.end(),out1,[](int i){return !(i%2 == 0);});
copy_if(ivec.begin(),ivec.end(),out2,[](int i){return i%2 == 0;});