stl容器使用中的经验(八)对于逐个字符的输入请考虑使用 istreambuf_iterator
先来看个例子:
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>
,函数有两个参数。
- 第一个参数名称为 inputFile,类型为
istream_iterator<int>
- 第二个参数没有名称。类型是指向不带参数的函数的指针,该函数的返回值是
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
,两者的区别也是显而易见的。
istream_iterator
较istreambuf_iterator
耗时更久istream_iterator
默认是忽略字符中的空格的- 需要设置
inputData.unsetf(ios::skipws);
因此,如果需要从输入流中逐个读取字符,istreambuf_iterator
是个不错的选择,就不必要进行格式化输入,因为 istream_iterator
在调用其 operator <<
时其实是进行了格式化的输入。但istreambuf_iterator
从一个输入流中 stream s
读取下一个字符是通过 s.rdbuf()->sgetc()
完成的。 如果追求输入的效率,那么选择istreambuf_iterator
。
同样的,输出的时候也可以选择 ostreambuf_iterator
。
stl容器使用中的经验(八)对于逐个字符的输入请考虑使用 istreambuf_iterator相关推荐
- 海量数据处理算法 各种STL容器使用的数据结构剖析
教你如何迅速秒杀掉:99%的海量数据处理面试题 转载于:结构之法算法之道blog 前言 一般而言,标题含有"秒杀","99%","史上最全/最强&qu ...
- 助力PAT甲级/乙级取得满分的小技巧,STL容器
STL容器的高级玩法 写在前面:本人于2020PAT甲级取得满分(见本人其他博客),在刷题过程中我有了很多自己的小经验和技巧,在这里分享给大家,祝大家刷题顺利,早日拿到免费的PAT徽章~~ 注意:这里 ...
- c++ STL 容器
STL源码分析 (一)vector容器 vector的数据安排以及操作方式,与array非常相似.两者的唯一区别在于空间的运用的灵活性.array是静态空间,一旦配置了就不能改变.vector是动态空 ...
- C++常用STL容器
C++常用STL容器 vector 向量容器 二维数组指针.二维向量 pair 对 list 双向列表 map 表 unordered_map 哈希表 set 集合 unordered_set 哈希集 ...
- C++ 笔记(19)— 标准模板库(STL容器、STL迭代器、STL算法、STL容器特点、STL字符串类)
C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...
- C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——遍历和删除
相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(Windows VirtualStudio)--插入>已给出.本文将分析各个容器中遍历和查找的性能.(转载请 ...
- C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——删除
相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(Windows VirtualStudio)--插入>已给出.本文将分析从头部.中间和尾部对各个容器进行删除 ...
- C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——遍历和查找
相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(ubuntu g++)--插入>已给出.本文将分析各个容器中遍历和查找的性能.(转载请指明出于breakso ...
- C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——删除
相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(ubuntu g++)--插入>已给出.本文将分析从头部.中间和尾部对各个容器进行删除的性能.(转载请指明出 ...
最新文章
- 调试的时候step into,step out,step over有什么区别?各有什么作用?分别在什么情况下使用?
- Nuxt(一) Nuxt初步认识
- 2021,如何找到适合自己的圈子?
- Vim的基本操作总结
- 详解在ASP.NET中用LINQ实现数据处理
- 怎么看服务器cpu温度命令_简单几步使用zabbix监控Linux物理服务器CPU温度
- 叫板 Android 开发!跨平台应用开发神器 Flutter 又添开源插件!| 技术头条
- JavaScript HTML5脚本编程——“跨文档消息传递”的注意要点
- python linux教程_Linux for Python教程01
- 循环渐进NsDoor(三)
- CentOS下通过yum安装svn及配置
- Android应用程序键盘(Keyboard)消息处理机制分析(19)
- python实现WGS84平面大地坐标(X,Y)转换经纬度BL类
- 如何在码云上面上传本地项目
- 安全帽检测/人脸识别系统国标GB28181协议云服务EasyGBS搭建智慧工地 助力智慧建筑生态圈
- IBM Jdk环境启动jboss,出现如下错误:SunX509 KeyManagerFactory not available
- 元学习提高黑盒对抗攻击
- 正则表达式训练-QQ号校验
- 电动汽车(EV)电池粘合剂市场现状及未来发展趋势
- 导入 xlsx php,php如何使用phpexcel类导入excel表格数据
热门文章
- 成功解决TypeError: ‘(slice(None, None, None), 1)‘ is an invalid key
- 国家应该专门出个程序量化标准.
- findAny和findFirst区别
- a标签超链接时跳转到新窗口
- cocos2d-x-3.3-024-仿微信飞机大战-如何引爆炸弹-实现范围攻击
- 【kafka连载三】windows本地kafka常用操作集合(持续更新)
- 3137102334_卓文翔_实验5
- 服务器更换硬盘要重装系统,电脑更换新硬盘后要怎么重装系统
- AcWing 1874. 哞加密(枚举,哈希)
- Spark SQL / Catalyst 内部原理 与 RBO