描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787121385346
“宝剑锋从磨砺出,梅花香自苦寒来。”
Boost是一个宝库,这本经过十年五版磨砺的经典Boost书也是宝库。
作者以其认真的写作态度、扎实的技术功底、十余年的坚持不懈,以及之前4版数万读者的支持与反馈,成就了这本Boost宝库,其中既有可以直接拿来用的代码,也有值得借鉴的技术设计思路。
十周年纪念版,值得你珍藏!
Boost是一个功能强大、构造精巧、跨平台、开源并且完全免费的C 程序库,有着“C ‘准’标准库”的美誉。Boost由C 标准委员会的部分成员所设立的Boost社区开发并维护,使用了许多现代C 编程技术,其内容涵盖字符串处理、正则表达式、容器与数据结构、并发编程、函数式编程、泛型编程、设计模式实现等许多领域,极大地丰富了C 的功能和表现力,能够使C 软件开发更加简捷、灵活和高效。本书基于2019年12月发布的Boost 1.72版编写,介绍了其中所有的160余个库,并且结合C 11/14/17标准详细、深入地讲解了其中的数十个库,同时实现了若干颇具实用价值的工具类和函数,可以帮助读者迅速地理解和掌握Boost的用法,并将其应用于实际的开发工作中。本书内容丰富、结构严谨、详略得当、讲解透彻,意在带领读者领略C *的前沿技术,相信它会成为每位C 程序员的必备工具书。
目录
第0章 导读 1
0.1 关于本书 1
0.2 读者对象 2
0.3 术语与风格 2
0.4 语言标准 3
0.5 本书的结构 4
0.6 如何阅读本书 5
0.7 本书的源码 5
第1章 总论 7
1.1 简介 7
1.1.1 获取方式 8
1.1.2 目录结构 8
1.1.3 使用方式 9
1.2 开发环境 10
1.2.1 快捷安装 10
1.2.2 完全安装 10
1.2.3 定制安装 11
1.2.4 编译验证 11
1.3 构建工具 12
1.3.1 安装方式 12
1.3.2 构建脚本 13
1.3.3 构建语言 13
1.3.4 构建命令 14
1.4 总结 14
第2章 时间与日期 15
2.1 timer库概述 15
2.2 timer 16
2.2.1 用法 16
2.2.2 类摘要 17
2.2.3 使用建议 18
2.3 progress_timer 18
2.3.1 用法 18
2.3.2 类摘要 19
2.4 date_time库概述 20
2.4.1 使用方式 20
2.4.2 基本概念 21
2.5 处理日期 21
2.5.1 日期 22
2.5.2 创建日期对象 22
2.5.3 访问日期 24
2.5.4 日期的输出 25
2.5.5 转换C结构 26
2.5.6 日期长度 26
2.5.7 日期运算 27
2.5.8 日期区间 29
2.5.9 日期区间运算 30
2.5.10 日期迭代器 32
2.5.11 其他功能 33
2.5.12 综合运用 33
2.6 处理时间 36
2.6.1 时间长度 36
2.6.2 操作时间长度 38
2.6.3 时间精确度 39
2.6.4 时间点 41
2.6.5 创建时间点对象 42
2.6.6 操作时间点对象 42
2.6.7 转换C结构 43
2.6.8 时间区间 44
2.6.9 时间迭代器 44
2.6.10 综合运用 45
2.7 date_time库的高级议题 48
2.7.1 编译配置宏 48
2.7.2 自定义字面值 48
2.7.3 格式化时间 49
2.7.4 本地时间 50
2.8 总结 51
第3章 内存管理 53
3.1 smart_ptr库概述 53
3.1.1 RAII机制 53
3.1.2 智能指针 54
3.2 scoped_ptr 55
3.2.1 类摘要 55
3.2.2 操作函数 56
3.2.3 用法 57
3.2.4 对比标准 59
3.3 shared_ptr 61
3.3.1 类摘要 61
3.3.2 操作函数 62
3.3.3 用法 64
3.3.4 工厂函数 65
3.3.5 应用于标准容器 66
3.3.6 应用于桥接模式 67
3.3.7 应用于工厂模式 68
3.3.8 定制删除器 70
3.3.9 高级议题 71
3.4 weak_ptr 75
3.4.1 类摘要 75
3.4.2 用法 75
3.4.3 对象自我管理 76
3.4.4 打破循环引用 77
3.5 intrusive_ptr 79
3.5.1 类摘要 79
3.5.2 用法 80
3.5.3 引用计数器 81
3.6 pool库概述 82
3.7 pool 82
3.7.1 类摘要 83
3.7.2 操作函数 83
3.7.3 用法 84
3.8 object_pool 85
3.8.1 类摘要 85
3.8.2 操作函数 85
3.8.3 用法 86
3.8.4 更多的构造参数 87
3.9 singleton_pool 88
3.9.1 类摘要 88
3.9.2 用法 89
3.10 总结 90
第4章 实用工具 93
4.1 noncopyable 93
4.1.1 原理 94
4.1.2 用法 94
4.1.3 实现 95
4.2 ignore_unused 96
4.2.1 基本用法 96
4.2.2 模板用法 97
4.3 optional 98
4.3.1 类摘要 98
4.3.2 操作函数 99
4.3.3 用法 100
4.3.4 工厂函数 102
4.4 assign 102
4.4.1 list_inserter 102
4.4.2 operator = 103
4.4.3 operator () 105
4.4.4 generic_list 106
4.4.5 初始化容器 107
4.4.6 重复输入 108
4.4.7 操作非标准容器 109
4.4.8 其他议题 110
4.5 tribool 111
4.5.1 类摘要 111
4.5.2 用法 112
4.5.3 为第三态更名 113
4.5.4 比较optional 114
4.6 operators 115
4.6.1 基本运算概念 115
4.6.2 算术操作符 116
4.6.3 基类链 119
4.6.4 复合运算概念 120
4.6.5 相等与等价 121
4.6.6 解引用操作符 123
4.6.7 下标操作符 124
4.6.8 布尔转型操作符 125
4.6.9 二元操作符 126
4.7 exception 127
4.7.1 标准库中的异常 127
4.7.2 类摘要 128
4.7.3 向异常传递信息 129
4.7.4 错误信息类 131
4.7.5 包装标准异常 132
4.7.6 使用函数抛出异常 133
4.7.7 获得更多信息 134
4.7.8 高级议题 135
4.8 uuid 137
4.8.1 类摘要 137
4.8.2 用法 138
4.8.3 生成器 140
4.8.4 增强用法 142
4.8.5 转换字符串 143
4.9 config 144
4.9.1 编译期字符串化 144
4.9.2 静态整型常量 145
4.10 utility 145
4.10.1 二进制常量 146
4.10.2 调用函数名 147
4.11 总结 148
第5章 字符串与文本处理 151
5.1 lexical_cast 151
5.1.1 函数声明 152
5.1.2 用法 152
5.1.3 错误处理 153
5.1.4 转换要求 155
5.1.5 转换自定义类 155
5.1.6 对比标准 156
5.2 format 157
5.2.1 简单的例子 158
5.2.2 输入操作符 159
5.2.3 类摘要 160
5.2.4 格式化语法 162
5.2.5 性能优化 163
5.2.6 高级用法 163
5.3 string_ref 164
5.3.1 类摘要 165
5.3.2 用法 166
5.4 string_algo 168
5.4.1 简单示例 168
5.4.2 算法概述 169
5.4.3 大小写转换 170
5.4.4 判断式(算法) 171
5.4.5 判断式(函数对象) 172
5.4.6 分类 173
5.4.7 修剪 174
5.4.8 查找 175
5.4.9 替换与删除 177
5.4.10 分割 178
5.4.11 合并 180
5.4.12 查找(分割)迭代器 181
5.5 xpressive 182
5.5.1 使用方式 182
5.5.2 正则表达式简介 183
5.5.3 类摘要 184
5.5.4 正则匹配 186
5.5.5 正则查找 189
5.5.6 正则替换 190
5.5.7 正则迭代 191
5.5.8 正则分词 192
5.5.9 高级议题 193
5.6 总结 196
第6章 正确性与测试 197
6.1 assert 197
6.1.1 基本用法 197
6.1.2 禁用断言 198
6.1.3 扩展用法 199
6.2 static_assert 201
6.2.1 定义 201
6.2.2 用法 201
6.3 lightweight_test 203
6.3.1 测试断言 203
6.3.2 用法 204
6.3.3 测试元编程 205
6.4 test 205
6.4.1 测试断言 206
6.4.2 测试主体 207
6.4.3 测试实例 209
6.4.4 测试夹具 211
6.4.5 测试日志 213
6.4.6 运行参数 214
6.4.7 高级议题 215
6.5 总结 218
第7章 容器与数据结构 219
7.1 array 219
7.1.1 类摘要 220
7.1.2 操作函数 221
7.1.3 用法 222
7.1.4 能力限制 222
7.1.5 初始化 223
7.1.6 对比标准 223
7.2 dynamic_bitset 224
7.2.1 类摘要 224
7.2.2 创建与赋值 225
7.2.3 容器操作 227
7.2.4 基本运算 228
7.2.5 访问元素 228
7.2.6 类型转换 230
7.2.7 集合操作 231
7.2.8 综合运用 231
7.3 unordered 233
7.3.1 散列集合简介 233
7.3.2 散列集合的用法 235
7.3.3 散列映射简介 237
7.3.4 散列映射的用法 239
7.3.5 高级议题 240
7.4 bimap 242
7.4.1 类摘要 242
7.4.2 基本用法 243
7.4.3 值的集合类型 245
7.4.4 集合类型的用法 246
7.4.5 使用标签类型 247
7.4.6 使用assign库 249
7.4.7 查找与替换 249
7.4.8 投射 251
7.4.9 高级议题 252
7.5 circular_buffer 253
7.5.1 类摘要 253
7.5.2 用法 254
7.5.3 环形结构 255
7.5.4 空间优化 256
7.6 tuple 257
7.6.1 二元组 257
7.6.2 类摘要 258
7.6.3 创建与赋值 258
7.6.4 访问元素 260
7.6.5 比较操作 261
7.6.6 输入输出 262
7.6.7 联结变量 263
7.6.8 内部结构 263
7.6.9 使用访问者模式 265
7.6.10 高级议题 266
7.7 any 269
7.7.1 类摘要 269
7.7.2 访问元素 270
7.7.3 用法 271
7.7.4 简化操作 272
7.7.5 保存指针 273
7.7.6 高级议题 274
7.8 variant 275
7.8.1 类摘要 276
7.8.2 访问元素 277
7.8.3 用法 277
7.8.4 访问器 278
7.8.5 高级议题 281
7.9 multi_array 283
7.9.1 类摘要 283
7.9.2 用法 284
7.9.3 改变形状和大小 286
7.9.4 创建子视图 287
7.9.5 适配普通数组 288
7.9.6 高级议题 289
7.10 property_tree 291
7.10.1 类摘要 292
7.10.2 读取配置信息 293
7.10.3 写入配置信息 295
7.10.4 更多用法 296
7.10.5 数据格式 297
7.10.6 高级议题 300
7.11 总结 301
第8章 算法 305
8.1 foreach 305
8.1.1 用法 306
8.1.2 详细解说 307
8.1.3 更优雅的名字 308
8.1.4 支持的序列类型 308
8.1.5 存在的问题 309
8.2 minmax 310
8.2.1 用法 310
8.2.2 存在的问题 311
8.3 minmax_element 312
8.3.1 基本用法 312
8.3.2 其他用法 313
8.4 algorithm 313
8.4.1 clamp 314
8.4.2 clamp_range 314
8.4.3 hex/unhex 315
8.5 总结 316
第9章 数学与数字 317
9.1 math.constants 317
9.1.1 基本用法 318
9.1.2 高级用法 319
9.2 integer 319
9.2.1 整数特征 319
9.2.2 标准整数类型 321
9.2.3 整数类型模板类 322
9.3 rational 326
9.3.1 类摘要 326
9.3.2
推荐序
最近一年,我电话面试了数十位C 应聘者,惯用的暖场问题是“您在工作中使用过STL的哪些组件?用过Boost的哪些组件?”,我得到的答案大多为vector、map和shared_ptr。如果对方是在校学生,我一般会问他vector或map的内部实现、各种操作的复杂度,以及迭代器失效的可能场景。如果对方是有经验的程序员,我会追问shared_ptr的线程安全性、循环引用的后果及如何避免、weak_ptr的作用等。如果对方回答得不错,还可以进一步问问他如何实现线程安全的引用计数,如何定制删除动作等。这些问题能让我迅速判别对方的C 水平。
我之所以在面试时问到Boost,是因为其中的许多组件确实可以用于编写可维护的产品代码。Boost包含近百个程序库,其中不乏具有工程实用价值的佳品。每个人的习惯与技术背景不一样,对Boost的取舍也不一样。就我个人的经验而言,首先,可以使用绝对无害的库,如noncopyable、scoped_ptr、static_assert等,学习和使用这些库比较简单。其次,有些功能很容易自己实现,正好Boost里提供了现成的代码,那就不妨一用,如date_time和circular_buffer等。然后,在新项目中,进行消息传递和资源管理可以考虑采用更加现代的方式,如在某些情况下用function/bind代替虚函数作为库的回调接口、借助shared_ptr实现线程安全的对象回调等,这二者会影响整个程序的设计思路与风格,需要通盘考虑,如果能正确使用智能指针,那么在现代C 程序里一般不需要出现delete语句。最后,应对某些性能不佳的库保持警惕,如lexical_cast。总之,在每个项目组成员都能理解并运用的基础上,适当引入现成的Boost组件,可以减少重复劳动,提高生产力。
Boost是一个宝库,其中既有可以直接拿来用的代码,也有值得借鉴的设计思路。试举一例:正则表达式库regex对线程安全的处理。
早期的RegEx类不是线程安全的,它把正则表达式和匹配动作放到了一个类里边。由于有可变数据,所以RegEx类的对象不能跨线程使用。如今的RegEx类明确地区分了不可变(immutable)数据与可变(mutable)数据,前者可以安全地跨线程共享,后者则不行。例如,正则表达式本身(basic_regex)与一次匹配的结果(match_results)是不可变的;而匹配动作本身(match_regex)涉及状态更新,它是可变的,于是要用可重入的函数将其封装起来,避免这些数据泄露给别的线程。正是由于做了这样合理的区分,所以在正常使用RegEx类时就不必加锁。
Donald Knuth在Coders at Work一书里表达了这样一个观点:如果程序员的工作就是摆弄参数去调用现成的库,而程序员不知道这些库是如何实现的,那么这份职业就没啥乐趣可言。换句话说,固然我们强调在工作中不要重新发明轮子,但是作为一个合格的程序员,应该具备自制轮子的能力,非不能也,是不为也。
C/C 语言的一大特点是其标准库可以用语言自身实现。C标准库的strlen、strcpy、strcmp系列函数是教学与练习的好题材,C 标准库的complex、string、vector则是类、资源管理、模板编程的绝佳示范。在深入了解STL的实现之后,运用STL自然手到擒来,并能自动避免一些错误和低效的用法。
为了消除使用Boost时的疑虑,用得更顺手,有时我们需要适当了解其内部实现,甚至编写简化版Boost以进行对比验证。但是由于Boost代码用到了日常应用程序开发中不常见的高级语法和技巧,并且为了跨多个平台和编译器大量使用了预处理宏,所以阅读 Boost源码并不轻松,需要使用者下一番功夫。如果使用者沉迷于这些有趣的底层细节而忘了原本要解决什么问题,恐怕就舍本逐末了。
Boost中的很多库是按泛型编程的范式来设计的,对于熟悉面向对象编程的人而言,或许面临一个思路的转变。例如,你需要熟悉泛型编程的那套术语,如concept、model、refinement,才容易读懂Boost.Threads文档中关于各种锁的描述。我想,对于熟悉STL设计理念的人而言,这不是什么大问题。
在某些领域,Boost不是唯一的选择,也不一定是最好的选择。例如,要生成公式化的源代码,我会首选用脚本语言写一小段代码生成程序,而不用Boost.Preprocessor;要在C 程序中嵌入领域特定语言,我会首选Lua或其他语言解释器,而不用Boost.Proto;要用C 程序解析上下文无关文法,我会首选用ANTLR来定义词法与语法规则并生成解析器(parser),而不用Boost.Spirit。总之,使用Boost时心态要平和,别较劲去改造C 语言,把Boost有助于提高生产力的那部分功能充分发挥出来,让项目从中受益才是关键。
要学习Boost,除了阅读其官方网站的文档、示例与源码,最好能在手边放一本比较全面的中文书,以随时翻阅。对不谙英文的开发者而言,这更是可幸之至。您手上这本《Boost 程序库完全开发指南》就是很好的使用指南与参考手册,在这本书中,作者由浅入深地介绍了Boost的大部分常用内容,能让读者迅速了解Boost,并从中找到自己需要的部分。拿到这本书之后,我有粗有细地阅读了一遍,总体来看,作者水平很高,也相当务实,作者对C 和Boost的理解与运用很到位,我从这本书中学到了不少新知识。为此,我乐于向希望学习Boost程序库的开发者推荐这本靠谱的书。
须知“功不唐捐”,作为一名现代C 程序员,在Boost上投入的精力定能获得回报。
陈硕
《代码大全》译者之一
中国香港
十周年纪念·特别序言
儿时的友情纯真得无忧无虑,长大后的友情真挚得催人泪下,朋友间说不出谢字,我们之间只剩一颗炽热的心。怀念那时每一场“战役”,那屋后白雪皑皑的“堡垒”,那游戏机前的等待。感谢那一只手套,那一个微笑,我们拥有着共同的岁月和青春,叫一声朋友,这个年代,这份友情,没有什么比你更加让我自豪。我的朋友!因为有你,童年才值得回味。就让我们紧握友情,幸福走过……
——小学同学 岳大海
罗剑锋是我的“发小”,那时的他是班级、学校的骄傲,是名副其实的“学霸”,现在的他则是我们这些玩伴的骄傲。他过着让别人羡慕的人生,但我们却知道,这是他一步一个脚印,一步一滴汗水走过来的。他所有的成就我们都有目共睹,儿时的种种经历虽已过许久,却记忆犹新。
他和我们一起疯过,笑过,闹过,奋斗过,拼搏过,那些回忆让人更珍惜我们单纯的情谊。有种惦记疏淡,却很甘甜;有种问候平常,却很温暖;有种信任无言,却最亲切;有种友谊清澈,却最长远。
——小学同学 王峰
我跟老罗是从小认识的,他比我高很多年级,我上初中的时候他好像就参加完高考了。
那时候他一直是我们林场中“别人家的孩子”,不得不说老罗对我的影响挺大的,因为我的父母总教育我打游戏会耽误学习,但是我发现老罗游戏打得好,也没耽误学习啊。所以我对家长的这条教育一直是不屑的。但是后来我发现我错了,因为“既擅长打游戏又不耽误学习”不是适用于所有人的。
老罗打RPG/SLG游戏是高手,他很有耐心,一个游戏通关几遍是常事,然后还会鼓动你多尝试几次,不知道是不是想让他这个“游戏厅老板”多赚点钱。但是他不擅长对战类游戏,在这方面他常常是我的手下败将。
老罗喜欢看书、写书、看电影,当时我很难理解,书有什么可看的,不如多打几盘游戏。问题是他看书看多了,还要写书,这种表现太让人“气愤”了,有时恨得“咬牙切齿”,你说至于么,都是打游戏的人,何必甩我们几条街。看电影也是,看点中国的啊,全是国外的,不知道从哪里整得那么多碟片,我看都看不懂,就记得有部电影里面有个人躲子弹有点厉害。
不说了,人家现在日子过得好,说多了显得我嫉妒他。
——小学同学 袁斌
时光荏苒,岁月如梭,想想认识罗儿(我喜欢这么叫他)已有三十年了,岁月真是把杀猪刀啊!初一入学第一天我们相识的场景还历历在目,如今我的儿子都已经很大了,想想这三十年,我们是真正的好“基友”:初中、高中我们在同一个班,大学我们分开了一段时间,但大学毕业后,我们又来到同一个城市,还在同一个区。罗儿不仅是我的朋友,更是我的兄弟。
罗儿是一个很踏实的人,他做任何事情都会做到极致,我最佩服他这一点。同样是玩游戏,他不仅能通关还能给杂志社写攻略赚稿费。同样是学习,从初一开始,我们这届就没见过别人能考第一,无论你是从哪儿转学过来的,无论题有多难,他一直是我们这届学生中名副其实的“学霸”。我现在还经常用罗儿的事例教育我儿子:“你罗叔叔当年就是这么学的!”
罗儿是一个爱好广泛的人,喜欢迈克尔·杰克逊、郑智化的音乐,还喜欢看《七龙珠》《幽游白书》等漫画。刚开始我都不知道这些是什么,在他的带动下开始接触,也慢慢喜欢。我们总在一起讨论漫画情节,或者在晚自习回家的路上大声唱歌,我对这些事物仅仅是喜欢,但罗儿把漫画插页画出来还集成册,这就厉害了!
最后说到罗儿的书,其实我一点也不懂,真的是“天书”,但是我相信我兄弟,他的书准没错,就像他的人一样!
——中学同学 时吉斌
岁月在不知不觉间潺潺流淌,带走了三十载的光阴,罗剑锋中学时的样子仿佛还氤氲在我的眼前。
毕业后,昔日同窗的情谊没有因为距离增长而愈见稀薄,反而因为时间的酝酿而更加珍贵。闲暇或偶尔出差去北京时,我会与老友点我们最爱的烤鸭,共叙闲话,聊聊儿女,每每都会生出于繁忙生活中偷得闲生的轻松之感。
三十年后的今天,老同学说让我帮他的书写个序,一时感慨良多,说起来这还是我第一次为书写序。还记得初中时罗剑锋一直是班级第一,而我偏是那万年第二,少年的意气当然不允许这样,可惜超过他始终是这些年我未竟的心愿。他始终是我们中学同学的骄傲,记忆中他的眼睛总是那么炯炯有神,好像总有用不完的精力,没有解决不了的难题,在学习
评论
还没有评论。