流迭代器是一种迭代器适配器。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 }

输出结果为:

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

来源:http://www.linuxidc.com/Linux/2015-02/113455.htm

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

  1. ###STL学习--迭代器

    点击查看Evernote原文. #@author: gr #@date: 2014-08-23 #@email: forgerui@gmail.com STL中的迭代器. ###stl学习 |--迭代 ...

  2. STL基础--迭代器和算法

    1 迭代器 Iterators 5种迭代器类型 随机访问迭代器: vector, deque, array // 允许的操作 vector<int> itr; itr = itr + 5; ...

  3. STL的迭代器和类型萃取

    今天就可以把STL库中迭代器的实现,和类型萃取好好整理一下了 迭代器的设计思维是STL的关键所在,在STL的实际运用和泛型思维,迭代器都扮演着十分重要的角色,STL力求把数据容器和算法的概念分开来,于 ...

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

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

  5. 迭代器适配器{(插入迭代器back_insert_iterator)、IO流迭代器(istream_iterator、ostream_iterator)}

    一.迭代器适配器 反向迭代器 插入迭代器 IO流迭代器 其中反向迭代器可以参考以前的文章. 二.插入迭代器 插入迭代器实际上是一个输出迭代器(*it=; ++) back_insert_iterato ...

  6. STL : 反向迭代器(Reverse Iterator)

    1. 定义反向迭代器(Reverse Iterator)是一种反向遍历容器的迭代器.也就是,从最后一个元素到第一个元素遍历容器.反向迭代器将自增(和自减)的含义反过来了:对于反向迭代器,++运算将访问 ...

  7. 第十五篇:流迭代器 + 算法灵活控制IO流

    前言 标准算法配合迭代器使用太美妙了,使我们对容器(数据)的处理更加得心应手.那么,能不能对IO流也使用标准算法呢?有人认为不能,他们说因为IO流不是容器,没有迭代器,故无法使用标准算法.他们错了,错 ...

  8. 流迭代器 + 算法灵活控制IO流

    前言 标准算法配合迭代器使用太美妙了,使我们对容器(数据)的处理更加得心应手.那么,能不能对IO流也使用标准算法呢?有人认为不能,他们说因为IO流不是容器,没有迭代器,故无法使用标准算法.他们错了,错 ...

  9. C++ 标准模板库(STL)——迭代器(iterators)的用法及理解

    C++ STL中迭代器(iterators)用于遍历对象集合的元素.由于容器大小随着插入删除等操作动态改变,无法像静态数组那样获取数组长度然后遍历容器里的所有元素:这时就需要迭代器,每次从容器内第一个 ...

随机推荐

  1. 线性回归 Linear regression(1)线性回归的基本算法与求解

    本系列内容大部分来自Standford公开课machine learning中Andrew老师的讲解,附加自己的一些理解,编程实现和学习笔记. 第一章 Linear regression 1.线性回归 ...

  2. LOJ2323. 「清华集训 2017」小 Y 和地铁 【搜索】【思维】【好】

    LINK 思路 首先如果直接算每一个段有三个决策 左/右 上/下 跨不跨过端点 这样的复杂度是\((2^3)^{22}\),显然是无法接受的 然后考虑怎么优化这个东西 首先左右这个决策是没有意义的 因 ...

  3. 使用python处理selenium中的css_selector定位元素的模糊匹配问题

    # 匹配id,先指定一个html标签,然后加上“#”符号,再加上id的属性值 self.driver.find_element_by_css_selector('div#ID').click() # ...

  4. Xcode ARC需要什么版本的环境支持

    Mac OS X v10.6 和 v10.7 (64位应用) 的Xcode 4.2以上版本支持ARC,iOS 4 和 iOS 5 下ARC都能工作,但Weak不支持Mac OS X v10.6 和 i ...

  5. Flask第二篇——服务器相关

    web服务器.应用服务器和web应用框架 web服务器:负责处理http请求.响应静态文件,常见的有Apache,Nginx以及微软的IIS 应用服务器:负责处理逻辑的服务器.比如php.python ...

  6. LeetCode 760. Find Anagram Mappings

    原题链接在这里:https://leetcode.com/problems/find-anagram-mappings/description/ 题目: Given two lists Aand B, ...

  7. cmd连接mysql操作命令

    连接:mysql -h主机地址 -u用户名 -p用户密码 (注:u与root可以不用加空格,其它也一样)断开:exit (回车) 创建授权:grant select on 数据库.* to 用户名@登 ...

  8. DispatcherServlet的初始化(二)

    DispatcherServlet的初始化在springmvc的启动中有讲过,这一篇在上一篇的基础上接着讲.DispatcherServlet作为springmvc的前端控制器,还需要初始化其他的模块 ...

  9. jasmine 使用

    1. 下载浏览器运行测试包 https://github.com/jasmine/jasmine/releases 2.  解压,运行包含的测试 SpecRunner.html 3. 测试结果     ...

  10. 坑爹的AMH

    坑爹的 AMH的配置文件在这里: nginx 配置文件1:/usr/local/nginx-generic-1.6/conf/nginx.conf nginx 配置文件2:/home/wwwroot/ ...