欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++STL:流迭代器的函数构造、定义及使用分析

程序员文章站 2022-05-26 20:47:47
流迭代器是一种迭代器适配器。istream_iterator用于读取输入流,ostream_iterator用于写输出流。这些迭代器将它们所对应的流视为特定类型的元素序列。使用流迭代器时,可以用泛型...

流迭代器是一种迭代器适配器。istream_iterator用于读取输入流,ostream_iterator用于写输出流。这些迭代器将它们所对应的流视为特定类型的元素序列。使用流迭代器时,可以用泛型算法从流对象中读数据或将数据写入到流对象中。

流迭代器的构造函数如下:

C++STL:流迭代器的函数构造、定义及使用分析

流迭代器的基本操作如下:

C++STL:流迭代器的函数构造、定义及使用分析

1、流迭代器的定义。

流迭代器都是类模板:任何已定义输入操作符(>>操作符)的类型都可以定义istream_iterator,任何已定义输出操作符(<<操作符)的类型都可以定义ostream_iterator。

istream_iterator cin_it(cin); //从cin读取int型数据

istream_iterator end_of_stream; //指向超出末端位置

ofstream outfile;

ostream_iterator output(outfile, " ");

注意:

(1)在创建流迭代器时,必须指定迭代器所读写的对象类型。

(2)ostream_iterator不提供超出末端迭代器。

(3)创建ostream_iterator对象时,可提供第二个(可选的)实参,指定将元素写入输出流时使用的分隔符。分隔符必须是c风格字符串,所以必须以空字符结束,否则其行为是未定义的。

2、istream_iterator对象上的操作。

提供了输入操作符(>>)的任何类型都可以创建istream_iterator对象。构造与流绑定在一起的istream_iterator对象时,将对迭代器定位到第一个值。下面有两段程序是等价的:

/*程序1*/

istream_iterator in_iter(cin);

istream_iterator eof;

vector vec;

while (in_iter != eof)

{

vec.push_back(*in_iter++);

}

/*程序2*/

istream_iterator in_iter1(cin);

istream_iterator eof1;

vector vec(in_iter1, eof1);

程序1从cin中读取int型数据,并将读入的内容保存到vec中。当输入非int型数值或到达文件结束停止。程序2用一对标记元素范围的迭代器构造vec对象,效果与程序1相同。

3、ostream_iterator对象上的操作。

可用ostream_iterator对象将一个值序列写入流中。

ostream_iterator out_iter(cout, "\n");

istream_iterator in_iter(cin), eof;

while (in_iter != eof)

{

*out_iter++ = *in_iter++;

}

4、流迭代器的限制。

(1)不可能从ostream_iterator对象读入,也不可能写到istream_iterator对象中。

(2)一旦给ostream_iterator对象赋了一个值,写入就提交了。赋值后,没有办法再改变这个值。此外,ostream_iterator对象中每个不同的值都只能正好输出一次。

(3)ostream_iterator没有->操作。

5、与算法一起使用流迭代器。

算法是基于迭代器操作实现的。由于流迭代器支持迭代器操作,因此至少可在一些泛型算法上使用这类迭代器。

1 #include

2 #include

3 #include

4 #include

5 #include

6 using namespace std;

7

8 int main(void)

9 {

10 istream_iterator cin_it(cin);

11 istream_iterator end_of_stream;

12

13 vector vec(cin_it, end_of_stream);

14 sort(vec.begin(), vec.end());

15

16 ostream_iterator output(cout, " ");

17 unique_copy(vec.begin(), vec.end(), output);

18 cout << endl;

19

20 return 0;

21 }

输出结果为:

C++STL:流迭代器的函数构造、定义及使用分析

------------------------------分割线------------------------------