istream_iterator和ostream_iterator

       标准库为输入和输出iostream的iterator提供了支持,它们可以与标准库容器类型和泛型算法结合起来工作。istream_iterator类支持一个在istream,或其派生类(如ifstream输入文件流)上的iterator操作。类似的,ostream_iterator支持一个ostream或其派生类(如ofstream输出文件流)上的iterator操作。为了方便使用这两种iterator,我们必须包含头文件:#include<iterator>。情况下面的例子:

#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
#include <functional>

using namespace std ;

int main()
{
	istream_iterator<int> input(cin) ;    //从标准输入读入一个整数集,注意这里输入结束是按下ctrl+z来结束输入
	istream_iterator<int> end_of_stream ; //读入整数集的结束位置

	vector<int> vec ;
	copy(input,end_of_stream,inserter(vec,vec.begin())) ; //将读入的整数集插入到vector中
	sort(vec.begin(),vec.end()) ; //排序,升序

	ostream_iterator<int> output(cout," ") ;//向标准输出输出一个整数,并用空格分隔
	unique_copy(vec.begin(),vec.end(),output) ;
	cout << endl ;
}

下面具体介绍这两种iterator

1、istream_iterator

首先要知道istream_iterator是一个模板类

用下列一般形式声明一个istream_iterator类对象:

istream_iterator<Type> identifier(istream&) ;

   这里的Type表示任意一个已定义了输入操作符的内置或用户定义的类型

    identifier是istream_iterator类的对象

    istream&是istream_iterator类的构造函数的实参,该实参可以是istream类对象,如cin,或任意公有派生的istream子类型的对象,如ifstream定义的对象。例如:

//从标准输入读入一个complex对象的序列
istream_iterator<complex> is_complex(cin) ;

//从命名的文件中读入一个字符串序列
ifstream infile("C++ Primer") ;
istream_iterator<string> is_string(infile) ;

      应用在istream_iterator对象上的每个递增操作符,都用operator>>()读入输入流的下一个元素。为了通过istream_iterator和一个泛型算法读入输入流,我们需要提供一对iterator指示文件内部的开始和结束位置。用一个iterator对象初始化的istream_iterator(如is_string)提供开始位置。为了定义结束位置,我们使用专门的istream_iterator缺省构造函数创建的对象。也就是说:起始位置是以istream_iterator类的非缺省构造函数创建的对象。而结束位置是以istream_iterator类的缺省构造函数创建的对象。例如:

//从命名的文件中读入一个字符串序列
ifstream infile("C++ Primer") ;
istream_iterator<string> is_string(infile) ; //is_strng是istream_iterator的iterator对的起始位置,非缺省构造函数

//构造一个end_of_stream iterator用作iterator对的结束标记
istream_iterator<string> end_of_stream ; //end_of_stream是iterator对的结束位置,缺省构造函数

下面使用istream_iterator的iterator对:

//is_string是起始位置
//end_of_stream是结束位置
vector<string> text ;
copy(is_string,end_of_stream,inserter(text,text.begin)) ;

 

2、ostream_iterator

首先应该知道的是ostream_iterator是一个模板类。

用下列两种形式之一声明ostream_iterator:

ostream_iterator<Type> identifier(ostream&) ;
ostream_iterator<Type> identifier(ostream&,char* delimiter) ;

       这里重点介绍下第二种形式:delimiter表示一个C风格的字符串,它被输出到文件的每个元素后面。因为是C风格的字符串,所以它必须有空终止符,否则行为是未定义的。ostream&和上面的istream&类似。例如:

//向一个命名文件中写入一个字符串序列
//每一行放一个,注意是每一行放一个
ofstream outfile("dictionary") ;
ostream_iterator<string> os_string(outfile,"\n") ;

下面是一个简单的例子,它读取标准输入,并将其回显在标准输出上:

#include <iostream>
#include <iterator>
#include <algorithm>
using namespace std ;
int main()
{
	
	copy( istream_iterator<int>(cin),//使用无名的stream iterator
		  istream_iterator<int>(),
		  ostream_iterator<int>(cout)) ; 
	return 0 ;
}

     再看,下面的这个程序,再次使用copy算法和一个istream_iterator打开一个用户指定的文件,并将其回显在标准输出上。

#include <string>
#include <algorithm>
#include <iterator>
#include <fstream>

using namespace std ;

int main()
{
	string file_name;
	cout << "please enter a file to open: ";
	cin >> file_name;

	if ( file_name.empty() || !cin ) {
		cerr << "unable to read file name\n"; 
		return -1;
	}

	ifstream infile( file_name.c_str()); //打开文件
	if ( !infile ) 
	{
		cerr << "unable to open " << file_name << endl;
		return -2;
	}

	//从命名的文件中读入字符串序列
	istream_iterator< string > ins( infile ) ; 
	istream_iterator< string > eos; //结束位置

	//向标准输出写string对象序列
	//用空格分隔每个元素
	ostream_iterator< string > outs( cout, " " );

	copy( ins, eos, outs ); //ins是起始位置
	return 0 ;
}


 

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值