点击查看Evernote原文

#@author:       gr
#@date: 2014-08-31
#@email: forgerui@gmail.com

Chapter7 在程序中使用STL

Topic 43: 算法调用优先于手写的循环

  调用STL算法可以一次性达到想要的结果,减少中间过程资源时间的消耗,除此之外,编译器可能对一些算法进行了优化,比自己写循环更高效。

Topic 44: 容器的成员函数优先于同名的算法

  算法实现的时候为了保证算法的通用性,不会针对每种结构进行单独的优化,而使用容器的成员函数则可以针对这种容器进行优化。比如有些成员函数的时间复杂度可能为log(N),而通用算法可能会达到线性时间N,这种情况很常见。

Topic 46: 考虑使用函数对象而不是函数作为STL算法的参数

  使用函数对象,可以对函数进行内联,这样会减少额外的函数调用开销,同时,可以对函数进行重载,满足通用性要求。而使用函数,只能定义成一种函数指针形式,这样不利于扩展。

Topic 47: 避免“直写型代码”

  复杂语句很难懂,代码阅读的次数远远大于它被编写的次数,所以将复杂语句分解成更易于理解的简单语句,并且适当加上一些注释。

Topic 48: 总是包含(#include)正确的头文件

  1. 任何时候使用某一个头文件中的STL组件,你就应该包含这个头文件,即使当前的编译器允许你省略#include指令。当你移植到其它平台时,你的努力就会得到回报。

  2. 几乎所有容器都包含在其同名的头文件中,如vector包含在<vector>中,list包含在<list>中;但<set>中同时声明了setmultiset,同理<map>也是。

  3. 除了4个STL算法以外,所有其他算法都在<algorithm>中,这4个算法是accumlateinner_productadjacent_differencepartial_sum,它们被声明在<numeric>中。

  4. 特殊的迭代器,包括istream_iteratorostream_iterator被声明在<numeric>中。

  5. 标准的函数子(比如less<T>)和函数子配接器(比如not1bind2nd)被声明在<functional>中。

Topic 49: 学会分析与STL相关的编译器诊断信息

  1. 了解错误的源头

    使用string时的错误

    //string报错的语句

    string s(10);

    可能会报一些关于一长串关于std::basic_string<>的错误,看起来很混乱。这是因为,string并不是一个类,而是一个typedef,它可能是下面的basic_string实例的类型定义,当然有的编译器可能是其它的方式:

    basic_string<char, char_traits, allocator >

    所以可以将这一长串错误替换成string这样就变得清晰了。

  2. 尝试使用简单的类型去替换复杂的错误类型,从而简化错误信息,发现错误的原因。

  3. vectorstring的迭代器就是指针,所以当使用iterator出错时,编译器的诊断信息中可能会引用到指针类型。比如,如果源代码中引用vector<double>::iterator出错,编译器中很可能提到double*

  4. 如果你得到的错误来源于某一个STL算法的内部实现,可能是在调用算法时候,使用了错误的类型。

  5. 如果你正在使用一个很常见的STL组件,如vectorstringfor_each算法,但是错误信息看起来好像编译器一无所知,那么可能是没有包含头文件。

Topic 50: 熟悉与STL相关的Web站点

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

  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》--Chapter1

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

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

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

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

    点击查看Evernote原文. #@author: gr #@date: 2014-09-14 #@email: forgerui@gmail.com Chapter4 迭代器 Topic 26: i ...

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

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

  9. 《Effective STL中文版》前言

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

随机推荐

  1. hdoj 2817 A sequence of numbers【快速幂】

    A sequence of numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  2. 如何计算ModBus超时时间?

    波特率:每秒钟通过信道传输的信息量称为位传输速率,也就是每秒钟传送的二进制位数,简称比特率.比特率表示有效数据的传输速率,用b/s .bit/s.比特/秒,读作:比特每秒. 如9600b/s:指总线上 ...

  3. hdu 4607 (树形DP)

    当时比赛的时候我们找出来只要求出树的最长的边的节点数ans,如果要访问点的个数n小于ans距离直接就是n-1 如果大于的话就是(n-ans)*2+ans-1,当时求树的直径难倒我们了,都不会树形dp ...

  4. 【Stage3D学习笔记续】真正的3D世界(二):显示模型

    虽然我们进入真3D世界了,但是上一章的Demo仍然是显示的一个平面,尽管我们的平面在3D空间中旋转可以看出一点3D透视的效果,但是既然是真3D,就要拿出点3D的样子来! 如果要显示3D模型,我们就要告 ...

  5. JS实现项目查找功能

    又是好久没有更新文章了,技术差,人又懒是重罪啊!! 在工作中每天都要查找目前正在接手的项目,而如果项目一多起来怎么办呢? 最近主管突然说要找一下以前的项目改一点BUG,然后我就找了半天才找到对应的文件 ...

  6. Oracle 中利用闪回查询确定某表在某时间点之后的修改内容,并恢复至该时间点

    Oracle 中利用闪回查询确定某表在某时间点之后的修改内容: 1.查看 DELETE 及 UPDATE 操作修改的数据: SQL> SELECT * FROM tab AS OF TIMEST ...

  7. 拼接json示例 json分页并显示所有页码

    <%@ page language="java" import="java.util.*" pageEncoding="gbk"%&g ...

  8. 关于python文件操作 (转载)

    总是记不住API.昨晚写的时候用到了这些,但是没记住,于是就索性整理一下吧: python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Pyth ...

  9. 【55】让自己熟悉Boost

    1.网址:http://boost.org 2.有很多C++组织和网站,但是Boost库有两个优势:a.和标准委员会关系密切:b.加入C++标准的各种功能的测试场.

  10. 如何使得VIM显示行号

    如何使得VIM显示行号: :set number