C++STL:流迭代器

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

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

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

1、流迭代器的定义。

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

istream_iterator<int> cin_it(cin);            //从cin读取int型数据
istream_iterator<int> end_of_stream;            //指向超出末端位置

ofstream outfile;
ostream_iterator<int> output(outfile, " "); 

注意:

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

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

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

2、istream_iterator对象上的操作。

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

/*程序1*/
istream_iterator<int> in_iter(cin);
istream_iterator<int> eof;
vector<int> vec;

while (in_iter != eof)
{
    vec.push_back(*in_iter++);
}

/*程序2*/
istream_iterator<int> in_iter1(cin);
istream_iterator<int> eof1;
vector<int> vec(in_iter1, eof1);

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

3、ostream_iterator对象上的操作。

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

ostream_iterator<string> out_iter(cout, "\n");
istream_iterator<string> 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 <iostream>
 2 #include <iterator>
 3 #include <vector>
 4 #include <string>
 5 #include <algorithm>
 6 using namespace std;
 7
 8 int main(void)
 9 {
10     istream_iterator<int> cin_it(cin);
11     istream_iterator<int> end_of_stream;
12
13     vector<int> vec(cin_it, end_of_stream);
14     sort(vec.begin(), vec.end());
15
16     ostream_iterator<int> output(cout, " ");
17     unique_copy(vec.begin(), vec.end(), output);
18     cout << endl;
19
20     return 0;
21 }

输出结果为:

时间: 2024-08-04 05:19:45

C++STL:流迭代器的相关文章

STL之迭代器(iterator)

1 头文件 所有容器有含有其各自的迭代器型别(iterator types),所以当你使用一般的容器迭代器时,并不需要含入专门的头文件.不过有几种特别的迭代器,例如逆向迭代器,被定义于<iterator>中. 2 迭代器类型 迭代器共分为五种,分别为: Input iterator.Output iterator.Forward iterator.Bidirectional iterator.Random access iterator. 2.1 Input(输入)迭代器 只能一次一个向前读取

STL基础--迭代器和算法

1 迭代器 Iterators 5种迭代器类型 随机访问迭代器: vector, deque, array // 允许的操作 vector<int> itr; itr = itr + 5; // itr往前移5步 itr = itr - 4; if (itr2 > itr1) ... ++itr; // 前置的比后置的快 --itr; 双向迭代器: list, set/multiset, map/multimap // 允许的操作 list<int> itr; ++itr;

流迭代器的使用

10.29 编写程序,使用流迭代器读取一个文本文件,存入一个vector中的string里. #include<iostream> #include<vector> #include<fstream> #include<string> #include<iterator> using namespace std; int main() { ifstream in("1.txt"); istream_iterator<st

带你深入理解STL之迭代器和Traits技法

在开始讲迭代器之前,先列举几个例子,由浅入深的来理解一下为什么要设计迭代器. //对于int类的求和函数 int sum(int *a , int n) { int sum = 0 ; for (int i = 0 ; i < n ; i++) { sum += *a++; } return sum; } //对于listNode类的求和函数 struct ListNode { int val; ListNode * next; }; int sum(ListNode * head) { int

C++ Primer 学习笔记_54_STL剖析(九):迭代器适配器{(插入迭代器back_insert_iterator)、IO流迭代器(istream_iterator、ostream_i

回顾 适配器 1.三种类型的适配器: (1)容器适配器:用来扩展7种基本容器,利用基本容器扩展形成了栈.队列和优先级队列 (2)迭代器适配器:(反向迭代器.插入迭代器.IO流迭代器) (3)函数适配器:函数适配器能够将仿函数和另一个仿函数(或某个值.或某个一般函数)结合起来. [1]针对成员函数的函数适配器 [2]针对一般函数的函数适配器 一.迭代器适配器 1.反向迭代器 2.插入迭代器 3.IO流迭代器 其中反向迭代器,利用正向迭代器实现可以参考以前<46_STL剖析(三)>. 二.插入迭代

STL的迭代器和类型萃取

今天就可以把STL库中迭代器的实现,和类型萃取好好整理一下了 迭代器的设计思维是STL的关键所在,在STL的实际运用和泛型思维,迭代器都扮演着十分重要的角色,STL力求把数据容器和算法的概念分开来,于是就有了STL的两大部分,容器(container)和泛型算法(algorithms),泛型算法有很多参数都是迭代器. 举一个栗子!泛型算法find()的实现! 1 template<class InputIterator, class T> 2 InputIterator find(InputI

C++STL之迭代器

迭代器 迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围.迭代器就如同一个指针.事实上,C++的指针也是一种迭代器.但是,迭代器不仅仅是指针,因此你不能认为他们一定具有地址值.例如,一个数组索引,也可以认为是一种迭代器. 迭代器有各种不同的创建方法.程序可能把迭代器作为一个变量创建.一个STL容器类可能为了使用一个特定类型的数据而创建一个迭代器.作为指针,必须能够使用*操作符类获取数据.你还可以使用其他数学操作符如++.典型的,++操作符用来递增迭代器,以访问容器中的下一个对象

C++STL之迭代器2

在学习c++ STL的时候,整天碰到迭代器,也整天用,但是,到底它是个什么东西,很多人没有一个认识.这里我通过几个小的DEMO,来看看迭代器.首先我实现了一个十分简陋的vector类: 1 template <class T> 2 class vector { 3 private: 4 T* pbegin; 5 int n; //当前大小 6 public: 7 vector() { 8 pbegin = new T[100]; //暂时先固定大小 9 n = 0; 10 } 11 12 T*

(二)STL剖析——迭代器

TypeTraits.h #pragma once //双底线前缀的意思是SGI内部所用的东西,不在STL标准之内 //IteratorTraits负责萃取迭代器的特性 //__TypeTraits负责萃取型别的特性 struct __FalseType {}; struct __TrueType {}; //一个类究竟什么时候该有自己的平凡类型构造 template<class T> struct __TypeTraits { typedef __FalseType HasTrivialDe