没有合适的资源?快使用搜索试试~ 我知道了~
Scott Meyers的经典书,对提高使用STL的经验很有用。
资源详情
资源评论
资源推荐
Eective STL 中文版 By Suninf
本书作者为 ,由龚敏敏翻译。
前言
致谢
导读
容器
条款
:仔细选择你的容器
条款
:小心对“容器无关代码”的幻想
条款
:使容器里对象的拷贝操作轻量而正确
条款
:用
来代替检查
是否为
条款
:尽量使用区间成员函数代替它们的单元素兄弟
条款
:警惕
最令人恼怒的解析
条款
:当使用
得指针的容器时,记得在销毁容器前
那些指针
条款
! :永不建立
"#$
的容器
条款
% :在删除选项中仔细选择
条款
:注意分配器的协定和约束
条款
:理解自定义分配器的正确用法
条款
:对
&'
容器线程安全性的期待现实一些
(
和
)
条款
:尽量使用
(
和
)
来代替动态分配的数组
条款
:使用
(
来避免不必要的重新分配
条款
:小心
)
实现的多样性
条款
:如何将
(
和
)
的数据传给传统的
*+,
条款
:使用“交换技巧”来修整过剩容量
条款
! :避免使用
(-. /
关联容器
条款
% :了解相等和等价的区别
条款
:为指针的关联容器指定比较类型
条款
:永远让比较函数对相等的值返回
0"
条款
:避免原地修改
和
#
的键
条款
:考虑使用有序
(
代替关联容器
条款
:当关乎效率时应该在
"11"23 和
"4
之间仔细选择
条款
:熟悉非标准散列容器
迭代器
条款
:尽量用
"
代替
$" , ($"
和
$($"
条款
:用
"
和
"("
把
$"
转化成
"
条款
! :了解如何通过
($"
的
."
得到
"
条款
% :需要一个一个字符输入时考虑使用
".#0$"
1
算法
条款
:确保目标区间足够大
条款
:了解你的排序选择
条款
:如果你真的想删除东西的话就在类似
(
的算法后接上
"
条款
:提防在指针的容器上使用类似
(
的算法
条款
:注意哪个算法需要有序区间
条款
:通过
"5
或
6)"5"
比较实现简单的忽略大小写字符串
比较
条款
:了解
$0
的正确实现
条款
:用
"## "
或
0$"5
来统计区间
仿函数、仿函数类、函数等
条款
! :把仿函数类设计为用于值传递
条款
% :用纯函数做判断式
条款
:使仿函数类可适配
条款
:了解使用
$0# 、 $0#
和
$0#$0
的原因
条款
:确定
-&/ 表示
"-
使用
&'
编程
条款
:尽量用算法调用代替手写循环
条款
:尽量用成员函数代替同名的算法
条款
:注意
# 、 7 、 ."$"5 、 $.# 、 #$.#
和
8#" $")
的区别
条款
:考虑使用函数对象代替函数作算法的参数
条款
:避免产生只写代码
条款
! :总是 9 #
适当的头文件
条款
% :学习破解有关
&'
的编译器诊断信息
条款
:让你自己熟悉有关
&'
的网站
参考书目
附录
* :区域设置和忽略大小写的字符串比较
附录
: :在微软
&'
平台上的注意事项
词汇表
索引
关于本电子书
2
前言
It came without ribbons! It came without tags!
It came without packages, boxes or bags!
;;<=#>How the Grinch Stole
Christmas!>?"@#>%
我第一次写关于标准模板库的东西是在 %% 年,那时我决定把《AB(
》的最后一个条款写成一个 &' 的简要概览。我早该更好地了解 &'。不久以后,
我开始收到一些邮件,问我什么时候写《AB(&'》。
我把这个想法忍了几年。一开始,我对 &' 不够熟悉,所以不能给出关于它的建议。
但随着时间的推移,我 &' 的经验丰富了,而主要问题出现在了其他方面。当一个程
序库的在效率和可扩展性设计上表现出突破性的时候从来没有出过什么问题,但当开
始使用 &' 时,这成了我无法预见的实际问题。迁移到一个几乎最简单的 &' 程序都
成了一个挑战,不光是因为库的实现变化多端,而且因为现有编译器对模板支持有好
有坏。&' 的教材很难得到,所以学习“&' 的编程方式”很难;但即使跨越了这个障碍,
找到正确易学的参考文档同样很困难。可能最令人畏惧的是,即使最小的 &' 使用错
误也往往会导致一个编译器诊断的风暴——每一个错误都有上千个字长,而且大多涉
及的类,函数或模板在令人厌恶的源代码中并没有被提及——几乎都是难以理解的。
虽然我很钦佩 &' 和它背后的英雄们,但我还是觉得把 &' 推荐给实践中的程序员并
不合适。我不能肯定
有可能
有效地使用 &'。
然后我开始注意到一些让我感到惊奇的事情。尽管有很多小问题,尽管只有令人消沉
的文档,尽管编译器的诊断信息像无线电信号杂音,但仍然有很多我的咨询客户在使
用 &'。而且,他们不只是玩玩而已,他们竟然把 &' 用到了产品的代码中!这是一
个革命。我知道 &' 表现出的是一流的设计,但任何让程序员必须忍受移植性的麻烦、
贫乏的文档和天书般的错误信息,却设计得很好的库也是不会被拥护的。我了解到越
来越多的专业程序员都认为即使一个实现得很不好的 &' 也比什么都没有要好得多。
此外,我知道 &' 的境遇只会越来越好。程序库和编译器对(它们的)标准兼容性会
越来越好,更好的文档将会出现(它已经存在了——请见从 % 页开始的“参考书
目”),而且编译器的诊断会渐渐改进(在极大程度上,我们仍然在等待,但条款
%
提供了怎样在其间应付的建议)。因此我决定插嘴,尽一份力量来支持 &' 运动的萌
芽。这本书就是结果:改善使用 &' 的 个有效做法。
一开始,我计划在 %%% 年下半年写这本书。带着这个想法,我组织了一个大纲。但
我暂停和改变了进程。我停止了写书的工作,开发了一个介绍性的 &' 训练课程,把
它教给几拨不同的程序员。大约一年后,我回到写书的工作中,根据我在训练课程中
得到的经验意味深长地修改了大纲。和我的《AB(》成功的方法一样,它
们都是以真正的程序员所面对的问题为基础的。我希望《AB(&'》同样从事于
&' 编程的实践方面——这是对专业开发人员最重要的方面。
3
我总是在寻找能让我加深对 理解的方法。如果你对 &' 编程有新的建议或者如果
你对这本书有什么评论的话,请让我知道。另外,让本书尽可能地正确是我继续的目
标,所以如果谁挑出了本书的任何一个错误请务必告诉我——不论是技术、语法、错
别字或任何其他东西——我将在本书再次印刷的时候,把第一位挑出错误的读者大名
加到致谢名单中。请将你的建议、见解、批评发至 C""=。
我维护有本书第一次印刷以来的修订记录,其中包括错误更正、文字修润、以及技术
更新。这份记录可以从《AB(&'》的勘误表网
站 51DD=""=D:EA""D 4""=5
得到。
如果你希望在我对此书作出修改时得到通知,我想你应该加入我的邮件列表。我用这
个列表来通知对我的 工作感兴趣的人。详情请见 51DD=""=D
" )'D。
F&&<FGH'*
AIA?
51DD=""=
&*JJF?<>
F?AHFK
*+?,'
致谢
在我理解 &'、建立关于它的培训课程和写这本书的大约两年时间里,我得到了大量
帮助。在我所有帮助的来源中,有两个特别重要。 第一个是 "E?)。当我建
立它们时,"E 慷慨地自愿检查我的培训材料,而且我从他那里比从其他人那里学到
更多关于 &' 的东西。他也作为本书的技术评论家,再次提供改进了几乎每个条款的
观点和见解。
另一个突出的信息源是几个有关 的 G 新闻组,特别是 = ")=
="(“ L),==和 0=#. =(= 。十多年来,
我已经依赖于像这样的新闻组中的参加者来回答我的问题和挑战我的思想,而且很难
想象如果没有他们我该怎么办。我非常感谢 G 社区对本书和我早先关于 的
出版物的帮助。
多种出版物形成了我对 &' 的理解,其中最重要的列在了参考书目里。我对 M#
的《&5""'."》23倾向特别大。
本书基本上是其他人做的一些见解和观点的摘要,虽然有一些想法是我自己的。我已
经努力跟踪我在哪里学到了什么,但这个任务是没希望的,因为一个典型的条款包含
在很长时间内从很多来源收集的信息。所以跟踪是不完全的,但是我已经尽力了。请
4
注意在这里我的目标是总结一个想法或技术我第一次是在哪里学到的,而不是一个想
法或技术最先在哪里开发或谁先想到了它。
在条款
,我的基于节点的容器对事务性语义提供了更好的支持的观点是基于 M#
的《&5""'."》第 == 节23。条款
包括一个来自 "E
?) 的关于当分配器类型改变之后 0 起了什么作用的例子。条款
由
?( 的《?》专栏《&'H5"》23激发而来。条款
!
源自
# 的《A6" 》2!3的条款 ,而 N( @ 提供了关于
"#$ 的容器在实际中为什么失效的重要细节。在 G 的帖子里,"
*# 提供了分配器什么时候很有用的例子,而我把他的例子包含在条款
。条款
基于 H,&' 网站23上关于线程安全性的讨论。条款
关于引用计数在多线程
环境下的性能影响的材料来自 # 关于这个主题的文章23。条款
的主意来自
?( 的《?》专栏《G)"")5?" O >
+"》2!3。在条款
,"E?) 提出了我演示的让 *+, 直接把数据写入
一个 ( 的技术。条款
包含的信息来自 K"" 和 ":" 在
G 的帖子。条款
!
是我从 # 的《?》专栏《O5,"
"K""P》23偷来的。在条款
,"E?) 捐献了把
一个指针通过一个解引用仿函数转换成一个对象的主意,而 '"E 提
出了我呈现的 <0' 版本。条款
源自 <#)@" 在
0=#. =(= 的帖子,但我决定把那个条款的重点放在相等。条款
基
于 # 的《?》专栏《""'."K1""》
23;"*# 帮我了解了标准委员会的库问题9 的情况。条款
是从
*# 的《?》文章《O5I#5# QG44"O5"
G,"》23得到的灵感;<"(" .) 为我的 <""" 实现做出
了一个优雅的改进。我对 <E#" 的散列容器的描述基于 + "#) 的《D
GM#" 》专栏《@"5&". 》23。"E?) 并不同意条款
的全
部建议,但那个条款的早先动机是他的有些容器的成员函数只接受 " 类型的实
参的观点。我对条款
%
的处理来自和扩充自 "*# 和 M"N" 发起的
G 讨论;我也受到 N0 和 '") 的《?》文章《*
5", "0G4<7,"A6"》
23的影响。条款
是因为 M# 的《&5""'."》23第
== 节的讨论。在条款
,"<" "H"" 捐献了使用 5$ 计
算中值的例子,而使用那个算法来寻找百分点直接来自 ## 的《&5
+)")'")#")》23第 !== 节。条款
受到 M# 的《&5
""'."》23第 == 节的材料影响。条款
源自 *# 的《
?》专栏《@<"4,()"》23,而
M"N" 和 M5+ 的 帖子帮我精炼了我对出现这个问题的理解。
## 的 $0 实现,也就是我在条款
演示的,来自他的《&5
+)")'")#")》23第 !== 节。条款
%
受到 M# 的出版物很大的
推动,他在《&5""'."》23里写了“带状态的判定式”,在标准库
问题9%,和他的《?》文章《+"(=J#F.R》
23。在我这里,我使用了他的例子并接受他提出的一个解决方案,虽然术语“纯函数”
是我发明的。"*# 证实了我在条款
的关于属于 $0# 和
$0#$0 的历史的猜想。条款
可以追溯到当我考虑违反那个方针时 "E
5
剩余63页未读,继续阅读
linlingzhao
- 粉丝: 0
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0