Boost程序库完全开发指南――深入C++”准”标准库(第5版)
  • 推荐0
  • 收藏0
  • 浏览3.1K

Boost程序库完全开发指南――深入C++”准”标准库(第5版)

罗剑锋 (作者) 

  • 书  号:978-7-121-38534-6
  • 出版日期:2020-04-15
  • 页  数:608
  • 开  本:16(185*235)
  • 出版状态:上市销售
  • 维护人:孙学瑛
纸质版 ¥118.00
Boost是一个功能强大、构造精巧、跨平台、开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉。
Boost由C++标准委员会的部分成员所设立的Boost社区开发并维护,使用了许多现代C++编程技术,其内容涵盖字符串处理、正则表达式、容器与数据结构、并发编程、函数式编程、泛型编程、设计模式实现等许多领域,极大地丰富了C++的功能和表现力,能够使C++软件开发更加简捷、灵活和高效。
本书基于2019年12月发布的Boost 1.72版编写,介绍了其中所有的160余个库,并且结合C++11/14/17标准详细、深入地讲解了其中的数十个库,同时实现了若干颇具实用价值的工具类和函数,可以帮助读者迅速地理解和掌握Boost的用法,并将其应用于实际的开发工作中。
本书内容丰富、结构严谨、详略得当、讲解透彻,意在带领读者领略C++最新的前沿技术,相信它会成为每位C++程序员的必备工具书。
一本经过经历10年5版的磨砺、数万程序员的案头查询书!系统阐述历经30个版本更新的Boost标准库的经典技术书!
推荐序


最近一年,我电话面试了数十位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游戏是高手,他很有耐心,一个游戏通关几遍是常事,然后还会鼓动你多尝试几次,不知道是不是想让他这个“游戏厅老板”多赚点钱。但是他不擅长对战类游戏,在这方面他常常是我的手下败将。
老罗喜欢看书、写书、看电影,当时我很难理解,书有什么可看的,不如多打几盘游戏。问题是他看书看多了,还要写书,这种表现太让人“气愤”了,有时恨得“咬牙切齿”,你说至于么,都是打游戏的人,何必甩我们几条街。看电影也是,看点中国的啊,全是国外的,不知道从哪里整得那么多碟片,我看都看不懂,就记得有部电影里面有个人躲子弹有点厉害。
不说了,人家现在日子过得好,说多了显得我嫉妒他。
——小学同学 袁斌

时光荏苒,岁月如梭,想想认识罗儿(我喜欢这么叫他)已有三十年了,岁月真是把杀猪刀啊!初一入学第一天我们相识的场景还历历在目,如今我的儿子都已经很大了,想想这三十年,我们是真正的好“基友”:初中、高中我们在同一个班,大学我们分开了一段时间,但大学毕业后,我们又来到同一个城市,还在同一个区。罗儿不仅是我的朋友,更是我的兄弟。
罗儿是一个很踏实的人,他做任何事情都会做到极致,我最佩服他这一点。同样是玩游戏,他不仅能通关还能给杂志社写攻略赚稿费。同样是学习,从初一开始,我们这届就没见过别人能考第一,无论你是从哪儿转学过来的,无论题有多难,他一直是我们这届学生中名副其实的“学霸”。我现在还经常用罗儿的事例教育我儿子:“你罗叔叔当年就是这么学的!”
罗儿是一个爱好广泛的人,喜欢迈克尔·杰克逊、郑智化的音乐,还喜欢看《七龙珠》《幽游白书》等漫画。刚开始我都不知道这些是什么,在他的带动下开始接触,也慢慢喜欢。我们总在一起讨论漫画情节,或者在晚自习回家的路上大声唱歌,我对这些事物仅仅是喜欢,但罗儿把漫画插页画出来还集成册,这就厉害了!
最后说到罗儿的书,其实我一点也不懂,真的是“天书”,但是我相信我兄弟,他的书准没错,就像他的人一样!
——中学同学 时吉斌

岁月在不知不觉间潺潺流淌,带走了三十载的光阴,罗剑锋中学时的样子仿佛还氤氲在我的眼前。
毕业后,昔日同窗的情谊没有因为距离增长而愈见稀薄,反而因为时间的酝酿而更加珍贵。闲暇或偶尔出差去北京时,我会与老友点我们最爱的烤鸭,共叙闲话,聊聊儿女,每每都会生出于繁忙生活中偷得闲生的轻松之感。
三十年后的今天,老同学说让我帮他的书写个序,一时感慨良多,说起来这还是我第一次为书写序。还记得初中时罗剑锋一直是班级第一,而我偏是那万年第二,少年的意气当然不允许这样,可惜超过他始终是这些年我未竟的心愿。他始终是我们中学同学的骄傲,记忆中他的眼睛总是那么炯炯有神,好像总有用不完的精力,没有解决不了的难题,在学习中他总能帮助我,而多年之后在与他的闲聊中我也能得到很多中肯的人生建议。
现在老同学在计算机方面颇有研究,并在他自己的领域发光发热。我已经从事财务工作二十多年了,虽然不是很懂电子计算机方面的知识,但是我知道很多日常使用的软件都是用程序编写出来的。这本书应该是每位C++程序员必备的工具书,希望每一位使用这本“宝典”的读者都能像我一样从罗剑锋那里得到用之有益的帮助。
——中学同学 奚春玲

翻看你出版的这部书,回忆初中时代阳光帅气的你,心中满是感动敬佩。我懂得这部书的意义,也能想象出这些数字背后惊心动魄的成长故事。严谨务实,接地行走,方能破万里长风,渡自我沧海。
我清楚地记得,1990年9月1日,我迎来了一届初一新生。眉宇清秀的你举手投足流露着一股不达目的不罢休的执着。你是一个品学兼优的好学生,有远大的志向。从初一到初三,你德智体美全面发展,堪称全才。到现在,我还记得在学校书画展中,你的连环漫画被展出的情景。当时有很多老师和同学都慕名前来,对你笔下那些惟妙惟肖的动漫人物赞不绝口。我还记得你在紧张的学习之余写小说的情景……
你踏实做事,低调做人。作为学习委员,你不仅让自己的成绩一路领先,还能做老师的好帮手、同学的小老师。你是一个很有组织能力的学生,初三毕业时,你和其他同学组织了一次令我终生难忘的集体活动,召集同学们骑自行车去十几公里外的水库旅游景区。当时你不过十四五岁,但是对那次旅游的策划和组织是那么周到。同学们带着钓鱼的工具,带着野炊的锅碗瓢盆,甚至还带上了给自行车打气的气筒和防止跌伤的药物和绷带。一路上,你们几个跑前跑后,照顾着老师和同学。在你们的精心组织下,同学们玩得开心,老师也很放心,这成了我教学生涯最美好的回忆。
回忆三十年前的你,再看到现在你的成就,我倍感自豪。孔子在《易传》里说:“形而上者谓之道,形而下者谓之器。”器者,形也。有形则有度,有度则满盈。而君子不器,就是君子之思不器,君子之行不器,君子之量不器。君子不器,就是不被格局所限,不能囿于一技之长,或满足于一时所得,不能自满,而要不懈地追求。你就是具有不懈追求精神的人。
记取来时路,勿忘本初心。希望你继续奉君子不器,行孜矻之道,矢志追寻,再谱新篇!
——中学老师 邓英

我是罗剑锋的初中物理老师,因为他是一位全面发展的优秀学生,所以给我留下了极为深刻的印象,他朴实、聪慧、善良、勤奋、正直、与人为善、乐于助人……正是这些品质,让他取得了优异的成绩:在“全国应用物理知识竞赛”中获得了省赛区的四等奖,以全局总分第一名的成绩升入高中……这些似乎都“预示”了他今后的发展。
二十多年后再次相见,他已经是一位优秀的计算机专家,并出版了专著。能够有这么优秀的学生我深感荣幸,他有这么优秀的成绩我甚感高兴,祝愿他今后取得更加优秀的成果,造福社会和国家。
——中学老师 邓开林

“宝剑锋从磨砺出,梅花香自苦寒来。”
剑锋,一个从大山里走出来的孩子,带着天真和稚嫩,凭借着勤奋、刻苦、执着的拼搏和追求,从千军万马中脱颖而出,成为大都市里的佼佼者。曾经孤灯夜战、埋头苦读、漫卷长书的身影历历在目……今闻佳作已出,为师心里颇感激动,祝福学生百尺竿头更进步,浩瀚书海苦寻舟,鹏程万里,今年花胜去年红!
——中学老师 练鑫云

“墙裂”推荐,热烈祝贺老八大作出版十周年!
作者是睡在我上铺的兄弟!他是来自黑土地北大仓的上进好青年;是313寝室唯一的学霸,形象气质也符合学霸的特征(当年每次出校园都被盘查身份证、去星海电子市场都被搭讪兜售光盘,足以证明);他是兼职的寝室早饭外卖员、上课代签到员、自习室占座员(占座我们基本也不去)、考试辅导员(不能写太细,你懂的)……
难得的是,出身朴素、身兼数职的罗同学竟然没有被我们带歪,出淤泥而不染地考取了理工计算机“研究僧”,充分证明了是金子总会发光的强大定律!对了,补充一下,“罗桑”还擅长日式游戏(不是那方面的,别想歪了)。
——大学同学 陆程

披阅十载,增删五次,书见厚,发见少。
——大学同学 崔文杰

每个人的职业生涯中总有一些需要特别感谢的人,罗剑锋(Chrono)就是其中之一。
他是我的入职导师,在他的影响下,我开始学习《C++ Primer》《C++标准程序库》,开始学习Boost及设计模式等一系列技术知识。他的设计和实现极致精简,以至找不到任何一行多余的代码,多年后我也是这么要求周围其他同事的,这使得我们的产品线设计和实现风格非常统一。很多新入职的同事在工作过一段时间后,经常会从代码注释里发现原来Chrono就是《Boost程序库完全开发指南》的作者,令他们很兴奋,而我也不失时机地告诉他们:“是的,我很荣幸地和Chrono共事过一段时间。”

祝贺罗剑锋的书发行十周年,这是一本C++程序员进阶之路必看的书。
——同事 张秋香
前几天小罗找我,说自己的书已经出版十周年了,希望我写几句话。
小罗和我多年同事,我觉得他从一个程序员成长为一个大咖,和他做事严谨认真是分不开的。每次他都对程序精益求精,记得他会对编写的每一个文件都加上注释,写上自己的名字。也正是如此,他对于自己的每一段代码都非常重视,这是一个程序员的荣誉吧。
记得他离职几年后,还有新员工问我:“罗剑锋是谁啊?写的程序好牛啊。”祝贺小罗的书发行十周年!
——同事 戚天龙

认识剑锋已经十年了,十年间,他工作、生活、写书、讲课样样都做得精彩。常听人说程序员要经常熬夜,加班是常态,感叹剑锋竟然能在忙碌的工作时间之外做这么多常人不可企及的事。
《Boost程序库完全开发指南》十年间发行5版,足以证明此书的品质。能发掘这样有深度、有价值的好书是每位编辑的梦想,能读到这样的好书是每位读者的幸事。
——本书编辑 袁金敏

罗老师交来的书稿历来是令我最放心的书稿,放心是因为他认真的写作态度,放心是因为他对自己作品珍爱有加,放心是因为他扎实的技术功底,放心是因为他十年的坚持!现在,这本已第五次更新的《Boost程序库完全开发指南》十周年特别纪念版来了,让我们振奋精神,一起随着它品味C++的魅力!
——本书编辑 孙学瑛



十周年纪念·前言


我们的十年
每日埋头忙于工作和生活,等到写下这些文字时才蓦然发现,十年的光阴已经悄悄从身边溜走,不由得发出“逝者如斯夫,不舍昼夜”的感慨。
十年前大多数人还在用电话线“小水管”拨号上网,而十年后光纤宽带100M/200M已是常态。十年前IE浏览器还是上网主流,而十年后Chrome成了绝对霸主……
十年前功能手机正处巅峰,iPhone是刚崭露头角的“贵族”,而十年后智能手机已经普惠大众。十年前3G甫出,手机只能打电话发短信,而十年后5G已经“登场亮相”,各类App争奇斗艳,移动互联网渗透到了生活的方方面面……
十年前电影《阿凡达》刚刚上映,掀起了3D/IMAX的热潮,而十年后3D/IMAX已经比比皆是,但《阿凡达2》依旧遥遥无期……
十年前我的大女儿只有一岁半,而十年后二女儿都已经三岁了……
时间过得好快呀。
C++的十年
十年里的变化实在是太多太多,C++和Boost程序库也是这样。
在这十年里,C++推出了具有里程碑意义的C++11,开启了快速迭代的进化历程。从C++14、C++17一路走来,最新的携带诸多重磅新特性的C++20即将正式发布,令人十分期待。
在这十年里,C++也受到了诸多其他语言的挑战,D、Rust、Go、C#、Java等新老对手轮番上场,在C++的各个应用领域都发起了“猛攻”。但C++作为昔日的“龙头老大”,依然坚守住了一些“阵地”,维持着名声不坠。从TIOBE等编程语言排行榜来看,C++虽然已经不复当年的“王者荣耀”,但还是稳稳地占据着前五名之内的位置,这对一个有着三十多年历史的“老”语言来说算得上是相当难得了。
可以预见,在下一个十年里,C++依然会在底层、系统编程等领域具有优势,它的生命周期还很长,学习、使用C++还是有价值的。
Boost的十年
Boost作为C++的“‘准’标准库”,从十年前本书第1版时的1.42版本,发展到如今的1.72版本,中间经历了30个版本,基本保持着三四个月更新一次的频率。
作为一个“程序库”,它的改变没有语言标准那么“激进”,总体上保持着稳定的态势,仅移除了很少的几个旧组件(coroutine、minmal test、signal、tr1),同时其内部不断重构、优化、提升性能,还增加了数十个新组件。
通过这种严谨务实的做法,Boost一方面继续兼容不同的C++标准,另一方面又持续地扩充着C++的能力,为广大程序员提供了一个庞杂而可靠的“编程武器库”。无论你使用什么操作系统、编译器、语言标准,总能在Boost里找到称心如意的好东西。
十年的时间再次充分证明,“‘准’标准库”的名头绝非浪得虚名,而是实至名归。
不过随着C++标准和vc、gcc、clang等编译器的发展,越来越多的Boost组件都开始要求启用C++11了,这也算是件好事,毕竟C++98太“古老”了,适当地推动一下语言标准升级,对于你我来说,今后敲键盘的工作也能轻松一点。
本书的十年
本书第1版主要的开发环境是Windows和VC。到了第2版开发环境变成了Windows与Linux并重。随后的第3版和第4版,因为我的工作逐渐转移到了Linux,所以就放弃了Windows,全面采用了Linux和gcc。这些变化也反映了C++应用场景的变迁:由客户端转向服务器端开发。
关于本书的内容,因为编写本书第1版时C++11还未发布,只能使用C++98,所以第1版中重点介绍了Boost库里模拟C++11各种新特性、能够简化代码的组件,如typeof、foreach、result_of。编写本书第2版的时候C++11刚发布不久,编译器的支持还比较弱,只适当加入了少量C++11的内容。而在编写本书第3版和第4版的时候,各大编译器对C++ 11的支持已经很完善了,就完全采用了C++11,删去了旧版里许多过时的内容。
随着时代的前进,C++变得越来越“大”,Boost也变得越来越“大”,想在一本书(即使它很厚)里囊括所有内容已经成为一个“不可能的任务”。 所以这次的修订我放弃了全面翻新的想法,而是尽量让这本书保持稳定,不引入过于复杂、高深的组件,只介绍Boost里最基本、最有用、最常用的知识[① 想更深入了解C++/Boost程序库可以参考附录A的推荐书目[3]。]①。
希望本书能够成为Boost世界的“新手村”,无论是谁,都可以在这里磨炼、休息,在积累足够的经验后,再迈向外面的广阔天地。
十年感言
“十年之前,我不认识你,你不属于我。十年之后,我们是朋友,还可以问候。”
无论是新读者还是老朋友,我都衷心地感谢您对这本书的支持,祝愿我们都能在下一个十年里取得更大的进步,赢得更多的成功!


2020年2月20日 于 北京 798园区



第1版前言


屈指算来,接触C++语言至今已经有十余个年头了。回首往事,不禁感慨良多。
缘起
1996年,我上大学最开始学的是Pascal,不得不说,Pascal的程序风格严谨,确实很适合作为一门教学语言,然而用于实际开发它就不那么合适了(直到出现Delphi)。由于当时学校并未开设C语言课程,所以在Pascal课程结束后,我就买书自学C/C++语言,并在次年报名计算机软件专业的技术资格和水平考试,靠着一点点编程和考试的“天分”获得了高级程序员资质(当年很热衷考级考证,后来就“淡定”多了)。虽然有了资格证,但我仍然是个C++的初学者,对于C++的认识还处于C的面向过程和简单的基于对象层次上。
新千年伊始,我考入了北京理工大学就读研究生,因为跟导师做项目开始接触STL与C++标准库,大概是2005年从1.33版开始接触Boost,这才真正领略了C++的精髓。那段时期,Java和C#正在国内大行其道,C++则势单力薄,有关STL和C++标准的技术书籍寥寥无几,更没有讲解Boost的书,故对Boost的学习基本只能靠自己的摸索与实践。好在Boost自带的文档的内容相当丰富(尽管看全英文的资料十分辛苦),而且其源码也比较清晰规范,在熟悉了STL的基础上学习Boost倒也不算太难。
但Boost的一个最大的特点就是“庞大”,其功能组件众多,要想把它全部装进脑子里融会贯通基本上是不可能的,使用Boost时需要经常查阅英文文档,相当麻烦。因此,在学习的过程中,我逐渐产生了编写学习笔记的想法。一开始的学习笔记只是简单的纯文本文件,记录了一些使用经验,随着不断累积,纯文本形式已经不能够满足我整理知识的需求了,于是我又把这些文字迁移到了Word文档里,并把这些使用经验分类编目,进行较系统的归纳梳理。慢慢地,这份学习笔记居然有了上万字的规模,成了一份很好的Boost备忘参考,它在日常的开发工作中给了我很大的帮助。就像《设计模式》一书中所说的那样,我捕获了很多使用Boost解决问题的实践经验,避免了重复发现。不过,这份资料一直仅限于我个人使用,属于“自娱自乐”的作品,从未示人。
时间一晃,到了2010年1月份的某天夜里,不知道是什么原因,我忽然失眠了,躺在床上翻来覆去怎么也睡不着。突然,一个念头闯入了我的脑海:把Boost开发经验整理出版吧,让更多人能够分享这些知识,正所谓“独乐乐,与众乐乐,孰乐”。这个大胆的想法的出现让我那天的失眠又延长了几个小时——关于书的各种构想在我的头脑中“肆虐横行”。
随后的几天里,我就把这个想法付诸行动了,虽然以前写过并发表过很多文章,也在网上印刷了几本个人文集,但出版正式的书还是第一次。在把学习笔记进一步整理完善,编写出较完整的结构和一个样章后,我就开始联系出版社了。当初并没有多大的信心,毕竟我这个作者名不见经传,也没有什么资历、背景和名气(而且还是个“网盲”,从未跟随潮流开个人博客)。很幸运,我发出的第一个E-mail就是给电子工业出版社发的,而且编辑也在第一时间回复了我,这才给了我持续写作完成全书的动力。
在写作过程中,我也进一步加深了对Boost的认识,弄清了许多原来未曾注意到的细节。原本我只打算写20万字左右、三百多页,但写到中途,我发现Boost库的博大精深远非我当初的理解,也意识到了自己当初的学习比较肤浅。我历经了近半年近乎不眠不休的努力,最终呈现给读者的是这本厚达500多页的图书,本书的文字量是最初的学习笔记的数十倍,其内容也翔实丰满了很多——达成这个结果,我个人可以说是问心无愧了。
C++与Boost
与Java和C#等语言相比,C++最大的不同之处在于它并非由某个公司或个人把持的,它真正的发展动力来自广大的程序员。Boost就是这样的一个典范,它成功地填补了从C++98到C++0X这“失落的十年”间的空白,在竞争对手Java和C#不断更新版本、新增特性的时候以库的形式极大地增强了C++的能力,使C++不至于因为标准规范的滞后而落后于时代,而且Boost还深层次地挖掘了C++的潜力,开创了泛型编程、模板元编程、函数式编程等崭新的境界。
就个人来说,我比较喜欢的Boost版本有两个,分别是1.35版和1.39版。1.35版增加了asio、bimap、circular_buffer等许多重要组件,而1.39版则增加了signals2库,这两个版本都在我的工作用机上停留了相当长的时间。落笔之时,Boost已经更新到了1.43版,成长为一个相当完善、全面、强大的C++程序库。可以毫不夸张地说,现在的C++程序员,如果不熟悉Boost,那么他至少会丧失一半使用C++的好处,同时会多耗费数倍的开发精力和时间。
随着C++0X标准即将来临,Boost程序库的发展也出现了加速的趋势,由原来间隔数月不定期更新版本,改为定期(每3个月左右)发布新版本,而且每个新版本都会包含大量极有价值的更新内容。因此,希望读者在阅读本书时及时访问Boost的官网(http::// www.boost.org),以便获取最新的版本。
感谢读者选择本书,再说一句真心的“套话”(笑):限于作者水平有限,书中错漏在所难免,敬请读者原谅、指正。
致谢
首先,我要感谢整个C++群体,特别是C++语言的发明者Bjarne Stroustrup博士——他给我们带来了美妙的C++;然后是Alexander Stepanov和C++标准委员会——他们把STL引入了C++,开创了C++的现代编程风格;以及Beman G.Dawes、Boost程序库的所有作者和Boost社区——他们为我们奉献了如此高水准的程序库。
其次,我要感谢电子工业出版社博文视点公司,他们给了我这个把自己的开发经验出版成书的机会,在把潦草的个人学习笔记变成正式图书的过程中,他们付出了艰辛的努力。还要感谢陈硕先生,他审阅了本书的部分手稿,提出了很多有价值的参考意见,并慨然为本书撰写序言。
再次,我要感谢我的家人:感谢我的父母和弟弟,他们永远是我生命中最重要的人;感谢我的妻子,她自始至终都支持我写作,并担负了大部分照顾孩子的家务(虽然偶有怨言);我还要对已满一岁半的女儿说声抱歉,为了写作本书,我牺牲了很多陪她玩耍的时间。
再次,我还要感谢黄美华、冯薇、戚天龙、罗玉震、颜静、陈刚、张秋香、缪泽波等同事,长期的共事令我们建立了深厚的友谊。在此,我要对后两位同事致以特别的感谢,他们对完成本书的写作提供了大力的支持和帮助。
最后,感谢多年以来的好友岳大海、时吉斌、王峰,感谢我的中学老师邓英、杜爱芹、练鑫云、陈静,感谢我的研究生导师贾云得,以及所有在我成长过程中曾经给予我关心和帮助的朋友们!

罗剑锋
2010年6月7日 于 北京 王府井

目录

目录

第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 创建与赋值 327
9.3.3 基本运算 328
9.3.4 类型转换 328
9.3.5 其他议题 329
9.4 ratio 330
9.4.1 类摘要 330
9.4.2 用法 331
9.4.3 数字单位 331
9.4.4 字符串表示 333
9.5 crc 334
9.5.1 类摘要 334
9.5.2 预定义的实现类 335
9.5.3 用法 335
9.6 random 336
9.6.1 随机数发生器 337
9.6.2 随机数分布器 338
9.6.3 变量发生器 343
9.6.4 产生随机数据块 344
9.6.5 真随机数发生器 345
9.7 总结 347
第10章 操作系统相关 349
10.1 system 349
10.1.1 错误值 350
10.1.2 错误类别 350
10.1.3 错误代码 352
10.1.4 错误异常 354
10.2 chrono 355
10.2.1 时间长度 355
10.2.2 使用时间长度 357
10.2.3 时钟 358
10.2.4 时间点 360
10.2.5 综合运用 362
10.3 cpu_timer 364
10.3.1 时间类型 364
10.3.2 cpu_timer 365
10.3.3 auto_cpu_timer 366
10.3.4 定制输出格式 367
10.4 filesystem 369
10.4.1 类摘要 369
10.4.2 路径表示 371
10.4.3 可移植的文件名 372
10.4.4 路径处理 373
10.4.5 异常处理 376
10.4.6 文件状态 377
10.4.7 文件属性 379
10.4.8 文件操作 380
10.4.9 迭代目录 381
10.4.10 实例1 383
10.4.11 实例2 384
10.4.12 实例3 386
10.4.13 文件流操作 388
10.5 program_options 388
10.5.1 概述 389
10.5.2 选项值 391
10.5.3 选项描述器 393
10.5.4 选项描述器的用法 394
10.5.5 分析器 396
10.5.6 存储器 397
10.5.7 位置选项值 398
10.5.8 环境变量 400
10.5.9 分组选项信息 401
10.5.10 高级用法 403
10.6 总结 406
第11章 函数与回调 409
11.1 ref 409
11.1.1 类摘要 410
11.1.2 基本用法 411
11.1.3 工厂函数 411
11.1.4 操作包装 412
11.1.5 综合应用 413
11.1.6 对比标准 414
11.2 bind 415
11.2.1 工作原理 416
11.2.2 操作普通函数 417
11.2.3 操作成员函数 418
11.2.4 操作成员变量 419
11.2.5 操作函数对象 420
11.2.6 对比标准 421
11.2.7 高级议题 422
11.3 function 426
11.3.1 类摘要 426
11.3.2 声明形式 427
11.3.3 操作函数 428
11.3.4 用法 429
11.3.5 使用ref库 430
11.3.6 用于回调 431
11.3.7 对比标准 433
11.4 signals2 435
11.4.1 类摘要 435
11.4.2 操作函数 436
11.4.3 用法 437
11.4.4 返回值 439
11.4.5 合并器 440
11.4.6 管理信号连接 442
11.4.7 更灵活地管理信号连接 443
11.4.8 自动管理连接 445
11.4.9 应用于观察者模式 447
11.4.10 高级议题 449
11.5 总结 454
第12章 并发编程 457
12.1 atomic 457
12.1.1 类摘要 458
12.1.2 基本用法 460
12.1.3 整数用法 461
12.1.4 并发顺序一致性 462
12.2 thread 465
12.2.1 mutex 466
12.2.2 lock_guard 468
12.2.3 unique_lock 469
12.2.4 lock adapter 472
12.2.5 线程对象 474
12.2.6 使用线程 475
12.2.7 中断线程 478
12.2.8 线程组 482
12.2.9 call_once 483
12.2.10 condition_variable 484
12.2.11 shared_mutex 488
12.2.12 future 490
12.2.13 shared_future 493
12.2.14 高级议题 494
12.3 asio 498
12.3.1 概述 499
12.3.2 信号 505
12.3.3 定时器 510
12.3.4 网络通信 515
12.3.5 同步通信 521
12.3.6 异步通信 524
12.3.7 域名解析 529
12.3.8 使用协程 532
12.3.9 其他议题 534
12.4 总结 538
第13章 组件速览 541
13.1 算法 541
13.2 字符串与文本处理 542
13.3 容器与数据结构 543
13.4 迭代器 544
13.5 函数对象与高级编程 544
13.6 泛型编程 546
13.7 模板元编程 547
13.8 预处理元编程 548
13.9 并发编程 549
13.10 数学与数字 550
13.11 输入输出 551
13.12 系统相关 552
13.13 语言特性模拟 553
13.14 杂项 553
13.15 总结 555
第14章 设计模式 557
14.1 创建型模式 558
14.2 结构型模式 559
14.3 行为模式 562
14.4 其他模式 565
14.5 总结 567
第15章 结束语 569
15.1 未臻完美 569
15.2 锦上添花 570
15.3 工夫在诗外 572
15.4 临别赠言 573
附录A 推荐书目 575
附录B 标准简述 577
附录C 关键字浅谈 581

读者评论

相关图书

亿级流量系统架构设计与实战

李琛轩 (作者)

本书涵盖了亿级用户应用后台通用的技术和系统架构设计思路,在内容结构上分为三大篇:架构知识篇(第1~3章),作为全书的基础知识篇,首先介绍后台的关键组件构成以及机...

 

算法笔记(第2版)

刁瑞 谢妍 (作者)

ChatGPT掀起了现象级的风暴,赶超ChatGPT潮流,算法突破是关键。 本书介绍了若干常见算法,涉及排序、哈希、动态规划与近似算法、高斯消去法、图论与线性...

 

看漫画学Python:有趣、有料、好玩、好用(全彩修订版)

关东升 赵大羽 (作者)

ython是一门既简单又强大的编程语言,被广泛应用于数据分析、大数据、网络爬虫、自动化运维、科学计算和人工智能等领域。Python也越来越重要,成为国家计算机等...

 

Linux从入门到精通

张启玉 (作者)

本书以CentOS 7.8为演示系统,以阿里云为演示服务器,从Linux常用命令入手,从一毕业就要入职公司的上手要求出发,重实战、轻原理,目的就是要带领读者从一...

 

看漫画学Python 2:有趣、有料、好玩、好用(全彩进阶版)

关东升 ,赵大羽 (作者)

本书是《看漫画学Python》的进阶版本,继续秉承有趣、有料、好玩、好用的理念,并继续采用《看漫画学Python》一书中3个不同的漫画人物角色,通过这3个角色之...

 

趣玩Python:自动化办公真简单(双色+视频版)

本书以数据收集→数据清洗→数据分析→数据可视化→根据数据可视化结果(即图表)做决策为脉络,介绍Python在实际工作场景中的应用,侧重于用Python解决工作中...