###《Effective STL》--Chapter7
点击查看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
)正确的头文件
任何时候使用某一个头文件中的STL组件,你就应该包含这个头文件,即使当前的编译器允许你省略
#include
指令。当你移植到其它平台时,你的努力就会得到回报。几乎所有容器都包含在其同名的头文件中,如
vector
包含在<vector>
中,list
包含在<list>
中;但<set>
中同时声明了set
和multiset
,同理<map>
也是。除了4个STL算法以外,所有其他算法都在
<algorithm>
中,这4个算法是accumlate
、inner_product
、adjacent_difference
和partial_sum
,它们被声明在<numeric>
中。特殊的迭代器,包括
istream_iterator
和ostream_iterator
被声明在<numeric>
中。标准的函数子(比如
less<T>
)和函数子配接器(比如not1
、bind2nd
)被声明在<functional>
中。
Topic 49: 学会分析与STL相关的编译器诊断信息
了解错误的源头
使用string
时的错误
//string报错的语句
string s(10);可能会报一些关于一长串关于
std::basic_string<>
的错误,看起来很混乱。这是因为,string
并不是一个类,而是一个typedef
,它可能是下面的basic_string
实例的类型定义,当然有的编译器可能是其它的方式:
basic_string<char, char_traits, allocator >所以可以将这一长串错误替换成
string
这样就变得清晰了。尝试使用简单的类型去替换复杂的错误类型,从而简化错误信息,发现错误的原因。
vector
和string
的迭代器就是指针,所以当使用iterator
出错时,编译器的诊断信息中可能会引用到指针类型。比如,如果源代码中引用vector<double>::iterator
出错,编译器中很可能提到double*
。如果你得到的错误来源于某一个STL算法的内部实现,可能是在调用算法时候,使用了错误的类型。
如果你正在使用一个很常见的STL组件,如
vector
、string
或for_each
算法,但是错误信息看起来好像编译器一无所知,那么可能是没有包含头文件。
Topic 50: 熟悉与STL相关的Web站点
- SGI STL站点: http://www.sgi.com/tech/stl/
- STLport站点: http://www.stlport.org/
- Boost站点: http://www.boost.org
###《Effective STL》--Chapter7的更多相关文章
- 《Effective STL》学习笔记
http://www.cnblogs.com/arthurliu/archive/2011/08/07/2108386.html 作者:咆哮的马甲 出处:http://www.cnblogs.com/ ...
- ###《Effective STL》--Chapter3
点击查看Evernote原文. #@author: gr #@date: 2014-09-13 #@email: forgerui@gmail.com Chapter3 关联容器 Topic 22: ...
- ###《Effective STL》--Chapter5
点击查看Evernote原文. #@author: gr #@date: 2014-09-17 #@email: forgerui@gmail.com Chapter5 算法 Topic 30: 确保 ...
- ###《Effective STL》--Chapter6
点击查看Evernote原文. #@author: gr #@date: 2014-09-27 #@email: forgerui@gmail.com Chapter6 函数子.函数子类.函数及其他 ...
- ###《Effective STL》--Chapter1
点击查看Evernote原文. #@author: gr #@date: 2014-09-12 #@email: forgerui@gmail.com Chapter1 容器 Topic 4: 调用e ...
- ###《Effective STL》--Chapter2
点击查看Evernote原文. #@author: gr #@date: 2014-09-15 #@email: forgerui@gmail.com Chapter2 vector和string T ...
- ###《Effective STL》--Chapter4
点击查看Evernote原文. #@author: gr #@date: 2014-09-14 #@email: forgerui@gmail.com Chapter4 迭代器 Topic 26: i ...
- 容器使用的12条军规——《Effective+STL中文版》试读
容器使用的12条军规——<Effective+STL中文版>试读 还 记的自己早年在学校学习c++的时候,老师根本就没有讲STL,导致了自己后来跟人说 起会C++的时候总是被鄙视, ...
- 《Effective STL中文版》前言
<Effective STL中文版>前言 我第一次写关于STL(Standard Template Library,标准模板库)的介绍是在1995 年,当时我在More Effec ...
随机推荐
- A Tour of Go Exercise: Slices
Implement Pic. It should return a slice of length dy, each element of which is a slice of dx 8-bit u ...
- unigui下载文件
lblProduct.Caption := '<a href="files\1.t" target=new>要下载的文件名</a>';
- 【Stage3D学习笔记续】山寨Starling(十一):Touch事件体系
我们的山寨Starling版本将会在这里停止更新了,主要还是由于时间比较有限,而且我们的山寨版本也很好的完成了他的任务“了解Starling的核心渲染”,接下来的Starling解析我们将会直接阅读S ...
- Oracle 监听器无法启动(TNS-12537,TNS-12560,TNS-00507)
Oracle启动监听报错,提示 连接中断 [oracle@localhost ~]$ lsnrctl start LSNRCTL for Linux: Version 11.2.0.1.0 - Pro ...
- Java数据类型(一)
1 public class VarDemo 2 { 3 public static void main(String []args){ 4 //先声明后赋值 5 int number; 6 numb ...
- tomcat 虚拟目录与显示目录中文件列表
虚拟目录: 该方法推荐使用,比较简单. 在%tomcat%\conf\Catalina\localhost(该目录可能需要手工创建)下新建一个文件abc.xml,注意文件名中的abc就表示虚拟目录的名 ...
- cocos2d-x NotificationCenter
转自:http://www.xinze.me/cocos2d-x-ccnotificationcenter/ 在前端开发中,JS和as3中都有很好的监听机制, 我们使用Event的addEventLi ...
- CDOJ 1157 数列(seq) 分块+线段树
数列(seq) Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1157 Desc ...
- 如何编写程序设置Android来电铃声
我们在拿到新手机后通常会为其设置来年铃声,那么怎样通过代码来设置Android来电铃声,本文就为大家实例讲解下. 1.如果读到的是音频文件路径,需要先将音乐文件插入到多媒体库. Java代码 //设置 ...
- 代理模式及其在spring与struts2中的体现
代理模式 代理模式有三个角色组成: 1.抽象主题角色:声明了真实主题和代理主题的共同接口. 2.代理主题角色:内部包含对真实主题的引用,并且提供和真实主题角色相同的接口. 3.真实主题角色:定义真实的 ...