点击查看Evernote原文

#@author:       gr
#@date: 2014-09-14
#@email: forgerui@gmail.com

Chapter4 迭代器

Topic 26: iterator优先于const_iteratorreverse_iteratorconst_reverse_iterator

  在一些程序中,需要iterator的支持,而const_iterator无法满足要求,所以尽量使用iterator

Topic 27: 使用distanceadvance将容器的const_iterator转换成iterator

  使用distance可以计算两个迭代器(指向同一个容器)之间的距离,使用advance可以移动。

//const_iterator无法直接转换为iterator,会报错
deque<int>::const_iterator ci;
deque<int>::iterator i (ci);
//使用distance和advance组合去实现
advance(i, distance(i, ci));

  所以结论和Topic 26一样,尽量使用iterator代替constreverse

Topic 28: 正确理解由reverse_iteratorbase()成员函数所产生的iterator的用法

  容器类的有些成员函数只支持iterator,所有有时需要对其它类型进行转换。reverse_iteratorbase()iterator的对应结果依据你的操作而定:

  对于插入操作,两者的相对插入位置正好对应。无需进行++,--操作。

    vector<int>::reverse_iterator ri = find(v.rbegin(), v.rend(), 3);
vector<int>::iterator i(ri.base());
ve.insert(i, e);

  对于删除操作,转换之后,两者则不是删除同一个元素。下面的删除有问题,C和C++都规定从函数返回的指针不应被修改,所以在某些实现下会无法通过编译。

    //下面的删除有问题,可能无法编译
ve.erase(--ri.base());

  解决方法是在base()之前进行修改,之后再转换。

    ve.erase((++ri).base());

Topic 29: 对于逐个字符的输入请考虑使用istreambuf_iterator

  istreambuf_iterator直接从流的缓冲区中读取下一个字符,不会做安全检查,速度更快,可以提高40%,但只多敲了3个字符。

ifstream inputfile("a.txt");
string fileData(istreambuf_iterator<char>(inputfile), istreambuf_iterator<char>());

###《Effective STL》--Chapter4的更多相关文章

  1. 《Effective STL》学习笔记

    http://www.cnblogs.com/arthurliu/archive/2011/08/07/2108386.html 作者:咆哮的马甲 出处:http://www.cnblogs.com/ ...

  2. ###《Effective STL》--Chapter3

    点击查看Evernote原文. #@author: gr #@date: 2014-09-13 #@email: forgerui@gmail.com Chapter3 关联容器 Topic 22: ...

  3. ###《Effective STL》--Chapter5

    点击查看Evernote原文. #@author: gr #@date: 2014-09-17 #@email: forgerui@gmail.com Chapter5 算法 Topic 30: 确保 ...

  4. ###《Effective STL》--Chapter6

    点击查看Evernote原文. #@author: gr #@date: 2014-09-27 #@email: forgerui@gmail.com Chapter6 函数子.函数子类.函数及其他 ...

  5. ###《Effective STL》--Chapter7

    点击查看Evernote原文. #@author: gr #@date: 2014-08-31 #@email: forgerui@gmail.com Chapter7 在程序中使用STL Topic ...

  6. ###《Effective STL》--Chapter1

    点击查看Evernote原文. #@author: gr #@date: 2014-09-12 #@email: forgerui@gmail.com Chapter1 容器 Topic 4: 调用e ...

  7. ###《Effective STL》--Chapter2

    点击查看Evernote原文. #@author: gr #@date: 2014-09-15 #@email: forgerui@gmail.com Chapter2 vector和string T ...

  8. 容器使用的12条军规——《Effective+STL中文版》试读

    容器使用的12条军规——<Effective+STL中文版>试读     还 记的自己早年在学校学习c++的时候,老师根本就没有讲STL,导致了自己后来跟人说 起会C++的时候总是被鄙视, ...

  9. 《Effective STL中文版》前言

    <Effective STL中文版>前言     我第一次写关于STL(Standard Template Library,标准模板库)的介绍是在1995 年,当时我在More Effec ...

随机推荐

  1. nyoj 14 会场安排问题

    会场安排问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工 ...

  2. 低级错误之Oracle客户端添加数据

    本来可以为空的外键,自己非要写一个无意义的值,导致数据保存失败.

  3. 《MEF程序设计指南》博文汇总

    <MEF程序设计指南>博文汇总 在MEF之前,人们已经提出了许多依赖注入框架来解决应用的扩展性问题,比如OSGI 实现以Spring 等等.在 Microsoft 的平台上,.NET Fr ...

  4. datagridview控件--导出Excel

    dataGridView控件可以说很方便的显示了数据,而且对于修改和删除数据也很方便,我在前面的一篇博客中写到了如何去绑定数据到该控件上dataGridView控件--绑定数据方法,今天我将如何将数据 ...

  5. 【32】确定你的public继承塑模出Is-A关系

    1.public继承表示Is-A关系,也就是满足里氏代换.与之相对应的,private继承表示根据某物实现出,不满足里氏代换.子类对象初始化父类引用,编译通不过. 2.考虑下面的需求,企鹅继承鸟,Bi ...

  6. 一个 Android 任务队列的实现

    最近在做Android项目时遇到这样一个问题:客户端向服务器请求数据,而在网络信号太差的情况下,数据迟迟不到,甚至丢失.服务器为了解决这个问题做了频繁的重发,android 客户端就会收到很多不想要的 ...

  7. pomelo 开发环境搭建

    开发前提条件:  Windows系统,请确保你的Windows系统包括源代码编译工具.Node.js的源代码主要由C++代码和JavaScript代码构成,可是却用gyp工具来做源代码的项目管理,该工 ...

  8. Android Sqlite 导入CSV文件 .

    http://blog.csdn.net/johnnycode/article/details/7413111 今天遇到 Oracle 导出的12万条CSV格式数据导入 Android Sqlite ...

  9. spring Transaction Management --官方

    原文链接:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html 12.  ...

  10. python生成简单的验证码

    #coding=utf-8 from PIL import Image, ImageDraw, ImageFont, ImageFilter import random # 随机字母: def rnd ...