先来看个例子:

ifstream inputFile("ints.dat");
list<int> data(istream_iterator<int>(inputFile), istream_iterator<int>());

上面的这两行代码,貌似是将两个 isteam_iterator 迭代器传给list容器的构造函数,从而将文件中的数据拷贝到容器中。

但是,结果真的如我们所料吗?首先我们看下下面的代码。

int f(double d);
int f(double (d));
int f(double);

这三行代码效果是相同的,都是定义了一个函数,函数的返回值的int类型,参数是double类型。

下面的这行代码也是定义了一个函数,函数 g 以指向函数的指针为参数

int g( dlouble (*pf)() );

(*pf)() 是一个指向一个不带任何参数的函数的指针,返回值为double类型,返回值做了 函数 g 的参数。

那么下面的这个函数申明和上面表达了同样的含义。

int g( dlouble pf() );

如果我们将参数名称省略。

int g( dlouble () );

那么这个函数和上面的 int f(double (d));有什么区别呢?

我们可以看到,函数 f 的括号是在实参的两边,括号存在和不存在效果是一样的,但是函数 g 则不同,存在一个空的括号,根据推导,这个空的括号是有具体意义的,是存在一个函数指针参数的

接下来,我们看下最开始的问题。

ifstream inputFile("ints.dat");
list<int> data(istream_iterator<int>(inputFile), istream_iterator<int>());

那么我们就能够很明显的看出,第二行代码是申明了一个名称为data的函数。函数返回值类型为 list<int>,函数有两个参数。

  1. 第一个参数名称为 inputFile,类型为istream_iterator<int>
  2. 第二个参数没有名称。类型是指向不带参数的函数的指针,该函数的返回值是istream_iterator<int>

所以,上面的代码不会达到我们逾期的效果。

就跟下面的例子一样,是我们经常犯的错误,下面第二行代码并没有定义一个Widget的对象,而是申明了一个,没有参数,返回值类型为Widget,名称为w的函数。

class Widget{...};Widget w();

按照下面的方式解决上述的问题。让代码不要出现二义性。

ifstream inputFile("ints.dat");
istream_iterator<int> begin(inputFile);
istream_iterator<int> end;
list<int> data(begin, end);

我们再来看下下面的例子:

#include<iostream>
#include <fstream>
#include <ctime>
#include <iterator>
#include <cassert>using namespace std;int main()
{ifstream inputData("intdata.dat");assert(inputData.is_open());inputData.unsetf(ios::skipws);time_t t1 = time(NULL);string data((istream_iterator<char>(inputData)),  istream_iterator<char>());time_t t2 = time(NULL);cout << t1 << " " << t2 << endl; //1634635857 1634635866time_t t3 = time(NULL);string data2((istreambuf_iterator<char>(inputData)),  istreambuf_iterator<char>());time_t t4 = time(NULL);cout << t3 << " " << t4 << endl;   //1634635923 1634635923return 0;
}

上面的例子有两种从文件读取字符并构建了一个string的对象,前一种使用了 istream_iterator后一种使用的是istreambuf_iterator,两者的区别也是显而易见的。

  1. istream_iteratoristreambuf_iterator耗时更久
  2. istream_iterator默认是忽略字符中的空格的
  3. 需要设置 inputData.unsetf(ios::skipws);

因此,如果需要从输入流中逐个读取字符,istreambuf_iterator是个不错的选择,就不必要进行格式化输入,因为 istream_iterator在调用其 operator << 时其实是进行了格式化的输入。但istreambuf_iterator从一个输入流中 stream s 读取下一个字符是通过 s.rdbuf()->sgetc()完成的。 如果追求输入的效率,那么选择istreambuf_iterator

同样的,输出的时候也可以选择 ostreambuf_iterator

stl容器使用中的经验(八)对于逐个字符的输入请考虑使用 istreambuf_iterator相关推荐

  1. 海量数据处理算法 各种STL容器使用的数据结构剖析

    教你如何迅速秒杀掉:99%的海量数据处理面试题 转载于:结构之法算法之道blog 前言 一般而言,标题含有"秒杀","99%","史上最全/最强&qu ...

  2. 助力PAT甲级/乙级取得满分的小技巧,STL容器

    STL容器的高级玩法 写在前面:本人于2020PAT甲级取得满分(见本人其他博客),在刷题过程中我有了很多自己的小经验和技巧,在这里分享给大家,祝大家刷题顺利,早日拿到免费的PAT徽章~~ 注意:这里 ...

  3. c++ STL 容器

    STL源码分析 (一)vector容器 vector的数据安排以及操作方式,与array非常相似.两者的唯一区别在于空间的运用的灵活性.array是静态空间,一旦配置了就不能改变.vector是动态空 ...

  4. C++常用STL容器

    C++常用STL容器 vector 向量容器 二维数组指针.二维向量 pair 对 list 双向列表 map 表 unordered_map 哈希表 set 集合 unordered_set 哈希集 ...

  5. C++ 笔记(19)— 标准模板库(STL容器、STL迭代器、STL算法、STL容器特点、STL字符串类)

    C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...

  6. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——遍历和删除

    相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(Windows VirtualStudio)--插入>已给出.本文将分析各个容器中遍历和查找的性能.(转载请 ...

  7. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——删除

    相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(Windows VirtualStudio)--插入>已给出.本文将分析从头部.中间和尾部对各个容器进行删除 ...

  8. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——遍历和查找

    相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(ubuntu g++)--插入>已给出.本文将分析各个容器中遍历和查找的性能.(转载请指明出于breakso ...

  9. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——删除

    相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(ubuntu g++)--插入>已给出.本文将分析从头部.中间和尾部对各个容器进行删除的性能.(转载请指明出 ...

最新文章

  1. 调试的时候step into,step out,step over有什么区别?各有什么作用?分别在什么情况下使用?
  2. Nuxt(一) Nuxt初步认识
  3. 2021,如何找到适合自己的圈子?
  4. Vim的基本操作总结
  5. 详解在ASP.NET中用LINQ实现数据处理
  6. 怎么看服务器cpu温度命令_简单几步使用zabbix监控Linux物理服务器CPU温度
  7. 叫板 Android 开发!跨平台应用开发神器 Flutter 又添开源插件!| 技术头条
  8. JavaScript HTML5脚本编程——“跨文档消息传递”的注意要点
  9. python linux教程_Linux for Python教程01
  10. 循环渐进NsDoor(三)
  11. CentOS下通过yum安装svn及配置
  12. Android应用程序键盘(Keyboard)消息处理机制分析(19)
  13. python实现WGS84平面大地坐标(X,Y)转换经纬度BL类
  14. 如何在码云上面上传本地项目
  15. 安全帽检测/人脸识别系统国标GB28181协议云服务EasyGBS搭建智慧工地 助力智慧建筑生态圈
  16. IBM Jdk环境启动jboss,出现如下错误:SunX509 KeyManagerFactory not available
  17. 元学习提高黑盒对抗攻击
  18. 正则表达式训练-QQ号校验
  19. 电动汽车(EV)电池粘合剂市场现状及未来发展趋势
  20. 导入 xlsx php,php如何使用phpexcel类导入excel表格数据

热门文章

  1. 成功解决TypeError: ‘(slice(None, None, None), 1)‘ is an invalid key
  2. 国家应该专门出个程序量化标准.
  3. findAny和findFirst区别
  4. a标签超链接时跳转到新窗口
  5. cocos2d-x-3.3-024-仿微信飞机大战-如何引爆炸弹-实现范围攻击
  6. 【kafka连载三】windows本地kafka常用操作集合(持续更新)
  7. 3137102334_卓文翔_实验5
  8. 服务器更换硬盘要重装系统,电脑更换新硬盘后要怎么重装系统
  9. AcWing 1874. 哞加密(枚举,哈希)
  10. Spark SQL / Catalyst 内部原理 与 RBO