effective STL 读书笔记——第四章:迭代器
2017-05-13 20:59
483 查看
条款26:尽量用iterator代替const_iterator,reverse_iterator和const_reverse_iterator
1.四个迭代器的转换关系iterator可以转换为其他三个迭代器,const的迭代器之间可以相互转换,但const的迭代器不能转换为非const的迭代器 反向迭代器可以通过调用base来获取对应的正向迭代器
2.尽量使用iterator的理由
insert和erase需要iterator的迭代器,不接受cosnt_iterator和reverse_iterator const_iterator不能饮食转换为非const的iterator reverse_iterator需要转换为iterator时需要特别注意
条款27:用distance和advance把const_iterator转化成iterator
这个条款实际重新构建一个指向begin的iterator,然后通过distance算出begin到const_iterator之间的元素个数,通过advance将iterator移动到const_iterator指向的元素。要bb47
注意的是distance需要接受2个相同类型的迭代器,因此为了与const_iterator匹配,要使第一个参数为cosnt_iterator。使用示例如下:
typedef deque<int> IntDeque; // 和以前一样 typedef IntDeque::iterator Iter; typedef IntDeque::const_iterator ConstIter; IntDeque d; ConstIter ci; //do something Iter i(d.begin()); // 初始化i为d.begin() advance(i, distance<ConstIter>(i, ci));// 把i移到指向ci位置
条款28:了解如何通过reverse_iterator的base得到iterator
在不同的场景使用时,得到iterator的算法不一样,这和你实际使用的场景有关,主要原因是由于不管正序还是逆序,begin迭代器都是有效的,end迭代器都是无效的(空容器除外)。比如insert是在指定的iterator后面插入元素,erase是删除当前iterator的元素,对于vector,要删除reverse_iterator指向的元素,应该删除reverse_iterator.base的前一个元素。要在reverse_iterator处插入元素,实际上只要在其base返回的迭代器插入即可,如下:vector<int> v; //... // 向v插入1到5 vecot<int>::reverse_iterator ri = find(v.rbegin(), v.rend(), 3); // 同上,ri指向3 v.erase((++ri).base()); // 尝试删除ri.base()前面的元素; v.insert(ri.base());
要实现在一个reverse_iterator ri指出的位置上插入新元素,在ri.base()指向的位置插入就行了。对于 insert操作而言,ri和ri.base()是等价的,而且ri.base()真的是ri对应的iterator。
条款29:需要一个一个字符输入时考虑使用istreambuf_iterator
假设我们要把一个文本文件拷贝到一个字符串对象,我们似乎可以如下完成:ifstream inputFile("interestingData.txt"); inputFile.unset(ios::skipws); // 关闭inputFile的忽略空格的标记 string fileData((istream_iterator<char>(inputFile)), // 把inputFile读入 istream_iterator<char>()); // fileData;关于为什么
虽然上面的代码可以正确完成,但是如果涉及到效率的问题,可能无法满足你的需求。因为istream_iterator实际上是调用Operator<<来读取字符的,它是一个格式化字符的操作,每次读入字符时都会对字符进行检查。如果你仅仅需要读取字符,则可以使用istreambuf_iterator来代替。
ifstream inputFile("interestingData.txt"); string fileData((istreambuf_iterator<char>(inputFile)), istreambuf_iterator<char>());
istreambuf_iterator不会忽略空格,也不会进行字符格式检查,只是纯粹的读取字符到字符串对象中。
相关文章推荐
- python cook book第三版 读书笔记4(第四章,迭代器和生成器)
- 《Effective STL》读书笔记之容器1-5
- 《Effective STL》读书笔记
- JavaScript高级程序设计----读书笔记,第四章
- 读书笔记,《Java 8实战》,第四章,引入流
- Thinking in Java 读书笔记 第四章 控制执行流程
- 《redis实战》读书笔记-第四章:数据安全与性能保障
- 读书笔记 Effective STL
- 锋利的Jquery【读书笔记】 -- 第四章 jQuery中的事件和动画
- 《php开发典型模块大全》读书笔记 第四章 smarty (张迅雷闪击PHP系列)
- STL源码剖析_读书笔记:第四章 序列式容器 vector篇
- effective STL 读书笔记——第一章:容器
- C++ Primer 读书笔记 – 第四章
- [head first php&mysql]读书笔记-客户的反馈(第四章)
- 《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算
- Getting Started With Hazelcast 读书笔记(第四章)
- 《Linux Shell脚本攻略》读书笔记第四章 让文本飞
- C++ Primer 读书笔记 – 第四章
- 【读书笔记】《深入浅出nodejs》第四章 异步编程
- 《Fundamentals of Project Management 4th Edition》 读书笔记 第四章 为项目开发使命、远景和目标