书海网短评:
适读人群:C++程序员,想学习C++的读者。 “不熟悉C++标准库,任何人都称不上是高效的C++程序员。”——侯捷 C++11巨大革新,并已逐渐走向舞台中央,而其中变化大的,正是标准库 STL容器、算
《C++标准库(第2版)》是全球C++经典专业参考书籍时隔12年,基于C++11标准的全新重大升级。标准库提供了一组公共类和接口,极大地拓展了C++语言核心功能。《C++标准库(第2版)》详细讲解了每一标准库组件,包括其设计目的和方法、复杂概念的剖析、实用而高效的编程细节、存在的陷阱、重要的类和函数,又辅以大量用C++11标准实现的实用代码范例。除覆盖全新组件、特性外,《C++标准库(第2版)》一如前版,重点着眼于标准模板库(STL),涉及容器、迭代器、函数对象以及STL算法。此外,《C++标准库(第2版)》同样关注lambda表达式、基于区间的for循环、move语义及可变参数模板等标准库中的新式C++编程风格及其影响。
第2版译序xxi
第2版序言xxiii
第2版致谢xxiv
第1版序言xxv
第1版致谢xxvi
1关于《C++标准库(第2版)》
1.1缘起
1.2阅读前的必要基础
1.3《C++标准库(第2版)》风格与结构
1.4如何阅读《C++标准库(第2版)》
1.5目前发展情势
1.6范例代码及额外信息
1.7反馈
2C++及标准库简介
2.1C++Standard的历史
2.1.1C++11Standard常见疑问
2.1.2C++98和C++11的兼容性
2.2复杂度与Big-O标记
3语言新特性
3.1C++11语言新特性
3.1.1微小但重要的语法提升
3.1.2以auto完成类型自动推导
3.1.3一致性初始化(UniformInitialization)与初值列(InitializerList)
3.1.4Range-Basedfor循环
3.1.5Move语义和RvalueReference
3.1.6新式的字符串字面常量(StringLiteral)
3.1.7关键字noexcept
3.1.8关键字constexpr
3.1.9崭新的Template特性
3.1.10Lambda
3.1.11关键字decltype
3.1.12新的函数声明语法(NewFunctionDeclarationSyntax)
3.1.13带领域的(Scoped)Enumeration
3.1.14新的基础类型(NewFundamentalDataType)
3.2虽旧犹新的语言特性
3.2.1基础类型的明确初始化(ExplicitInitializationforFundamentalType)
3.2.2main()定义式
4一般概念
4.1命名空间(Namespace)std
4.2头文件(HeaderFile)
4.3差错和异常(ErrorandException)的处理
4.3.1标准的ExceptionClass(异常类)
4.3.2异常类(ExceptionClass)的成员
4.3.3以Classexception_ptr传递异常
4.3.4抛出标准异常
4.3.5自标准异常类派生
4.4CallableObject(可被调用的对象)
4.5并发与多线程
4.6分配器(Allocator)
5通用工具
5.1Pair和Tuple
5.1.1Pair
5.1.2Tuple(不定数的值组)
5.1.3Tuple的输入/输出
5.1.4tuple和pair转换
5.2SmartPointer(智能指针)
5.2.1Classshared_ptr
5.2.2Classweak_ptr
5.2.3误用SharedPointer
5.2.4细究SharedPointer和WeakPointer
5.2.5Classunique_ptr
5.2.6细究Classunique_ptr
5.2.7Classauto_ptr
5.2.8SmartPointer结语
5.3数值的极值(NumericLimit)
5.4TypeTrait和TypeUtility
5.4.1TypeTrait的目的
5.4.2细究TypeTrait
5.4.3ReferenceWrapper(外覆器)
5.4.4FunctionTypeWrapper(外覆器)
5.5辅助函数
5.5.1挑选最小值和最大值
5.5.2两值互换(Swapping)
5.5.3增补的"比较操作符"(ComparisonOperator)
5.6Classratio<>的编译期分数运算
5.7Clock和Timer
5.7.1Chrono程序库概观
5.7.2Duration(时间段)
5.7.3Clock(时钟)和Timepoint(时间点)
5.7.4C和POSIX提供的Date/Time函数
5.7.5以计时器停滞线程(BlockingwithTimer)
5.8头文件<cstddef>、<cstdlib>和<cstring>
5.8.1<cstddef>内的各项定义
5.8.2<cstdlib>内的各种定义
5.8.3<cstring>中的定义式
6标准模板库
6.1STL组件(Component)
6.2容器(Container)
6.2.1序列式容器(SequenceContainer)
6.2.2关联式容器(AssociativeContainer)
6.2.3序容器(UnorderedContainer)
6.2.4关联式数组(AssociativeArray)
6.2.5其他容器
6.2.6容器适配器(ContainerAdapter)
6.3迭代器(Iterator)
6.3.1关联式(Associative)及序(Unordered)容器的更多实例
6.3.2迭代器种类(IteratorCategory)
6.4算法(Algorithm)
6.4.1区间(Range)
6.4.2处理多重区间(MultipleRanges)
6.5迭代器之适配器(IteratorAdapter)
6.5.1InsertIterator(安插型迭代器)
6.5.2StreamIterator(串流迭代器)
6.5.3ReverseIterator(反向迭代器)
6.5.4MoveIterator(搬移迭代器)
6.6用户自定义的泛型函数(User-DefinedGenericFunction)
6.7更易型算法(ManipulatingAlgorithm)
6.7.1移除(Removing)元素
6.7.2更易Associative(关联式)和Unordered(序)容器
6.7.3算法vs.成员函数
6.8以函数作为算法的实参
6.8.1以函数作为算法实参的实例示范
6.8.2判断式(Predicate)
6.9使用Lambda
6.10函数对象(FunctionObject)
6.10.1定义一个函数对象
6.10.2预定义的函数对象
6.10.3Binder
6.10.4函数对象vs.Lambda
6.11容器内的元素
6.11.1容器元素的必要条件
6.11.2Value语义vs.Reference语义
6.12STL内部的错误和异常
6.12.1错误处理(ErrorHandling)
6.12.2异常处理(ExceptionHandling)
6.13扩展STL
6.13.1整合更多Type
6.13.2派生自STLType
7STL容器
7.1容器的共通能力和共通操作
7.1.1容器的共通能力
7.1.2容器的共通操作
7.1.3容器提供的类型
7.2Array
7.2.1Array的能力
7.2.2Array的操作
7.2.3把array当成C-StyleArray
7.2.4异常处理(ExceptionHandling)
7.2.5Tuple接口
7.2.6Array运用实例
7.3Vector
7.3.1Vector的能力
7.3.2Vector的操作
7.3.3将Vector当作C-StyleArray使用
7.3.4异常处理(ExceptionHandling)
7.3.5Vector使用实例
7.3.6Classvector<bool>
7.4Deque
7.4.1Deque的能力
7.4.2Deque的操作函数
7.4.3ExceptionHandling
7.4.4Deque运用实例
7.5List
7.5.1List的能力
7.5.2List的操作
7.5.3异常处理(ExceptionHandling)
7.5.4List运用实例
7.6ForwardList
7.6.1ForwardList的能力
7.6.2ForwardList的操作
7.6.3异常处理(ExceptionHandling)
7.6.4ForwardList运用实例
7.7Set和Multiset
7.7.1Set和Multiset的能力
7.7.2SetandMultiset的操作函数
7.7.3异常处理(ExceptionHandling)
7.7.4Set和Multiset运用实例
7.7.5运行期指定排序准则
7.8Map和Multimap
7.8.1Map和Multimap的能力
7.8.2Map和Multimap的操作函数
7.8.3将Map视为关联式数组(AssociativeArray)
7.8.4异常处理(ExceptionHandling)
7.8.5Map和Multimap运用实例
7.8.6综合实例:运用Map、String并于运行期指定排序准则
7.9序容器(UnorderedContainer)
7.9.1Unordered容器的能力
7.9.2创建和控制Unordered容器
7.9.3Unordered容器的其他操作
7.9.4Bucket接口
7.9.5使用UnorderedMap作为AssociativeArray
7.9.6异常处理(ExceptionHandling)
7.9.7Unordered容器的运用实例
7.10其他STL容器
7.10.1String作为一种STL容器
7.10.2C-StyleArray作为一种STL容器
7.11实现Reference语义
7.12各种容器的使用时机
8细探STL容器成员
8.1容器内的类型
8.2创建、复制和销毁(Create,Copy,andDestroy)
8.3非更易型操作(NonmodifyingOperation)
8.3.1大小相关操作(SizeOperation)
8.3.2元素比较(ComparisonOperation)
8.3.3Associative和Unordered容器特有的非更易型操作
8.4赋值(Assignment)
8.5元素直接访问(DirectElementAccess)
8.6"产出迭代器"之各项操作
8.7安插和移除(InsertingandRemoving)元素
8.7.1安插单一元素(InsertingSingleElement)
8.7.2安插多重元素(InsertingMultipleElements)
8.7.3移除元素(RemovingElement)
8.7.4重设大小(Resizing)
8.8List和ForwardList的特殊成员函数
8.8.1特殊成员函数(针对List和ForwardList)
8.8.2特殊成员函数(只针对ForwardList)
8.9容器的策略接口(PolicyInterface)
8.9.1非更易型策略函数(NonmodifyingPolicyFunction)
8.9.2更易型策略函数(ModifyingPolicyFunction)
8.9.3Unordered容器的Bucket相关接口
8.10对分配器(Allocator)的支持
8.10.1基本的分配器成员(FundamentalAllocatorMember)
8.10.2带有"可选之分配器参数"的构造函数
9STL迭代器
9.1迭代器头文件(HeaderFilesforIterators)
9.2迭代器种类(IteratorCategory)
9.2.1Output迭代器
9.2.2Input迭代器
9.2.3Forward(前向)迭代器
9.2.4Bidirectional(双向)迭代器
9.2.5Random-Access(随机访问)迭代器
9.2.6Vector迭代器的递增(Increment)和递减(Decrement)
9.3迭代器相关辅助函数
9.3.1advance()
9.3.2next()和prev()
9.3.3distance()
9.3.4iter_swap()
9.4迭代器适配器(IteratorAdapter)
9.4.1Reverse(反向)迭代器
9.4.2Insert(安插型)迭代器
9.4.3Stream(串流)迭代器
9.4.4Move(搬移)迭代器
9.5IteratorTrait(迭代器特性)
9.5.1为迭代器编写泛型函数(GenericFunction)
9.6用户自定义(User-Defined)迭代器
10STL函数对象及Lambda
10.1FunctionObject(函数对象)的概念
10.1.1以FunctionObject为排序准则(SortingCriterion)
10.1.2FunctionObject拥有内部状态(InternalState)
10.1.3for_each()的返回值
10.1.4Predicate(判断式)vs.FunctionObject(函数对象)
10.2预定义的FunctionObject和Binder
10.2.1预定义的FunctionObject
10.2.2FunctionAdapter和Binder
10.2.3以FunctionAdapter搭配用户自定义的FunctionObject
10.2.4过时的(Deprecated)FunctionAdapter
10.3运用Lambda
10.3.1Lambdavs.Binder
10.3.2Lambdavs.带有状态的(Stateful)FunctionObject
10.3.3Lambda调用全局函数和成员函数
10.3.4Lambda作为Hash函数、排序准则或相等准则
11STL算法
11.1算法头文件(HeaderFile)
11.2算法概观
11.2.1扼要介绍
11.2.2算法分门别类
11.3辅助函数
11.4for_each()算法
11.5非更易型算法(NonmodifyingAlgorithm)
11.5.1元素计数
11.5.2最小值和最大值
11.5.3查找元素(SearchingElement)
11.5.4区间的比较
11.5.5Predicate用以检验区间
11.6更易型算法(ModifyingAlgorithm)
11.6.1复制元素(CopyingElement)
11.6.2搬移元素(MovingElement)
11.6.3转换和结合元素(TransformingandCombiningElement)
11.6.4互换元素(SwappingElements)
11.6.5赋值(AssigningNewValue)
11.6.6替换元素(ReplacingElement)
11.7移除型算法(RemovingAlgorithm)
11.7.1移除某些元素
11.7.2移除重复元素
11.8变序型算法(MutatingAlgorithm)
11.8.1反转元素次序(ReversingtheOrderofElements)
11.8.2旋转元素(RotatingElements)
11.8.3排列元素(PermutingElements)
11.8.4对元素重新洗牌(ShufflingElements)
11.8.5将元素向前搬(MovingElementstotheFront)
11.8.6划分为两个子区间(PartitionintoTwoSubranges)
11.9排序算法(SortingAlgorithm)
11.9.1对所有元素排序
11.9.2局部排序(PartialSorting)
11.9.3根据第{\itshapen}个元素排序
11.9.4Heap算法
11.10已序区间算法(Sorted-RangeAlgorithm)
11.10.1查找元素(SearchingElement)
11.10.2合并元素(MergingElements)
11.11数值算法(NumericAlgorithm)
11.11.1运算后产生结果
11.11.2相对数列和绝对数列之间的转换
12特殊容器
12.1Stack(堆栈)
12.1.1核心接口
12.1.2Stack运用实例
12.1.3一个用户自定义的StackClass
12.1.4细究Classstack<>
12.2Queue(队列)
12.2.1核心接口
12.2.2Queue运用实例
12.2.3一个用户自定义的QueueClass
12.2.4细究Classqueue<>
12.3PriorityQueue(带优先级的队列)
12.3.1核心接口
12.3.2PriorityQueue运用实例
12.3.3细究Classpriority_queue<>
12.4细究ContainerAdapter
12.4.1类型定义
12.4.2构造函数(Constructor)
12.4.3PriorityQueue额外提供的构造函数
12.4.4各项操作(Operation)
12.5Bitset
12.5.1Bitset运用实例
12.5.2细究Classbitset
13字符串
13.1StringClass的目的
13.1.1例一:提炼临时文件名
13.1.2例二:提炼单词并反向打印
13.2StringClass细节描述
13.2.1String的各种相关类型
13.2.2操作函数概览
13.2.3构造函数和析构函数(ConstructorandDestructor)
13.2.4String和C-String
13.2.5大小和容量(SizeandCapacity)
13.2.6元素访问(ElementAccess)
13.2.7比较(Comparison)
13.2.8更改内容(Modifier)
13.2.9子字符串(Substring)及字符串接合(StringConcatenation)
13.2.10I/O操作符
13.2.11搜索和查找(SearchingandFinding)
13.2.12npos的意义
13.2.13数值转换(NumericConversion)
13.2.14String对迭代器的支持
13.2.15国际化(Internationalization)
13.2.16效率(Performance)
13.2.17String和Vector
13.3细究StringClass
13.3.1类型定义和静态值
13.3.2创建、复制、销毁(Create,Copy,andDestroy)
13.3.3大小和容量(SizeandCapacity)
13.3.4比较(Comparison)
13.3.5字符访问
13.3.6产生C-String和字符数组(CharacterArray)
13.3.7"改动"之相关操作(ModifyingOperation)
13.3.8查找(SearchingandFinding)
13.3.9子字符串(Substring)及字符串接合(StringConcatenation)
13.3.10I/O函数
13.3.11数值转换(NumericConversion)
13.3.12生成Iterator
13.3.13对Allocator的支持
14正则表达式
14.1Regex的匹配和查找接口(MatchandSearchInterface)
14.2处理"次表达式"(Subexpression)
14.3RegexIterator
14.4RegexTokenIterator
14.5用于替换的正则表达式
14.6RegexFlag
14.7Regex的异常(Exception)
14.8RegexECMAScript文法
14.9其他文法
14.10细究BasicRegex签名式
15以Stream完成I/O
15.1I/OStream的共通基础(CommonBackground)
15.1.1Stream对象
15.1.2StreamClass
15.1.3全局的Stream对象
15.1.4Stream操作符
15.1.5操控器(Manipulator)
15.1.6一个简单例子
15.2基本StreamClass和其对象
15.2.1Class及其层次体系
15.2.2全局性的Stream对象
15.2.3头文件
15.3标准的Stream操作符<<和>>
15.3.1Output操作符<<
15.3.2Input操作符>>
15.3.3特殊类型的I/O
15.4Stream的状态(State)
15.4.1表示"Stream状态"的常量
15.4.2用来"处理Stream状态"的成员函数
15.4.3Stream状态与Boolean条件测试
15.4.4Stream的状态和异常
15.5标准I/O函数
15.5.1Input相关函数
15.5.2Output相关函数
15.5.3实例
15.5.4sentry对象
15.6操控器(Manipulator)
15.6.1操控器概览
15.6.2操控器如何运作
15.6.3用户自定义的操控器
15.7格式化(Formatting)
15.7.1FormatFlag(格式标志)
15.7.2Boolean的I/O格式
15.7.3栏位宽度、填充字符、位置调整
15.7.4正号与大写
15.7.5数值基底(NumericBase)
15.7.6浮点数(Floating-Point)表示法
15.7.7一般格式(GeneralFormatting)定义
15.8国际化(Internationalization)
15.9文件访问(FileAccess)
15.9.1FileStreamClass
15.9.2FileStream的Rvalue和Move语义
15.9.3FileFlag(文件标志)
15.9.4随机访问(RandomAccess)
15.9.5使用文件描述器(FileDescriptor)
15.10为String而设计的StreamClass
15.10.1StringStreamClass
15.10.2StringStream的Move语义
15.10.3char*StreamClass
15.11"用户自定义类型"之I/O操作符
15.11.1实现一个Output操作符
15.11.2实现一个Input操作符
15.11.3以辅助函数完成I/O
15.11.4用户自定义之FormatFlag(格式标志)
15.11.5用户自定义I/O操作符的规约(Convention)
15.12连接Input和OutputStream
15.12.1以tie()完成松耦合(LooseCoupling)
15.12.2以Stream缓冲区完成紧耦合(TightCoupling)
15.12.3将标准Stream重定向(Redirecting)
15.12.4可读可写的Stream
15.13StreamBufferClass
15.13.1Stream缓冲区接口
15.13.2Stream缓冲区的Iterator
15.13.3用户自定义之Stream缓冲区
15.14关于效能(Performance)
15.14.1与C标准串流同步(SynchronizationwithC'sStandardStreams)
15.14.2Stream缓冲区内的缓冲机制
15.14.3直接使用Stream缓冲区
16国际化
16.1字符编码和字符集
16.1.1多字节(Multibyte)和宽字符(Wide-Character)文本
16.1.2不同的字符集
16.1.3在C++中处理字符集
16.1.4CharacterTrait
16.1.5特殊字符的国际化
16.2Locale(地域)概念
16.2.1使用Locale
16.2.2LocaleFacet
16.3细究Locale
16.4细究Facet
16.4.1数值格式化(NumericFormatting)
16.4.2货币符号格式化(MonetaryFormatting)
16.4.3时间和日期格式化(TimeandDateFormatting)
16.4.4字符的分类和转换
16.4.5字符串校勘(StringCollation)
16.4.6消息国际化(InternationalizedMessage)
17数值
17.1随机数及分布(RandomNumberandDistribution)
17.1.1第一个例子
17.1.2引擎(Engine)
17.1.3细说引擎(Engine)
17.1.4分布(Distribution)
17.1.5细说分布(Distribution)
17.2复数(ComplexNumber)
17.2.1Classcomplex<>一般性质
17.2.2Classcomplex<>运用实例
17.2.3复数的各项操作
17.2.4细说Classcomplex<>
17.3全局数值函数(GlobalNumericFunction)
17.4Valarray
18并发
18.1高级接口:async()和Future
18.1.1async()和Future的第一个用例
18.1.2实例:等待两个Task
18.1.3SharedFuture
18.2低层接口:Thread和Promise
18.2.1Classstd::thread
18.2.2Promise
18.2.3Classpackaged_task<>
18.3细说启动线程(StartingaThread)
18.3.1细说async()
18.3.2细说Future
18.3.3细说SharedFuture
18.3.4细说Classstd::promise
18.3.5细说Classstd::packaged_task
18.3.6细说Classstd::thread
18.3.7Namespacethis_thread
18.4线程同步化与Concurrency(并发)问题
18.4.1当心Concurrency(并发)
18.4.2ConcurrentDataAccess为什么造成问题
18.4.3什么情况下可能出错
18.4.4解决问题所需要的性质(Feature)
18.5Mutex和Lock
18.5.1使用Mutex和Lock
18.5.2细说Mutex和Lock
18.5.3只调用一次
18.6ConditionVariable(条件变量)
18.6.1ConditionVariable(条件变量)的意图
18.6.2ConditionVariable(条件变量)的第一个完整例子
18.6.3使用ConditionVariable(条件变量)实现多线程Queue
18.6.4细说ConditionVariable(条件变量)
18.7Atomic
18.7.1Atomic用例
18.7.2细说Atomic及其高级接口
18.7.3Atomic的C-Style接口
18.7.4Atomic的低层接口
19分配器
19.1以应用程序开发者的角度使用Allocator
19.2用户自定义的Allocator
19.3以程序库开发者的角度使用Allocator
参考书目
新闻组及论坛(NewsgroupandForum)
书籍和网站
索引
我从未想过《C++标准库(第2版)》第1版会卖得如此长久。现在,经过12年的等待,出新版本的时候到了,一个涵盖最新C++11标准的新版本。
注意,其中的意义比仅仅添加新子库更多更大。C++已经改变了,其标准库的几乎所有典型应用如今看起来都有那么一点不同。这不是因为语言出现巨大变化,而是许多小改变造成的结果,例如运用rvaluereference和movesemantic、range-based书乯乲loop、乡乵乴乯,以及新的template特性。因此,《C++标准库(第2版)》不但展现原标准库的补充特性及新成员,书中所有例子也都重新写过,或至少局部改写。尽管如此,为了支持那些仍然使用“旧”C++环境的程序员,《C++标准库(第2版)》会在遭遇C++版本差异时加以描述。
我学习C++11有一段艰难的历程。大约两年前我开始看C++11但并未追随标准化的脚步,因此确实遭遇了理解上的麻烦。但是标准委员会的人帮助我描述及表现C++11新特性,一如它们如今呈现的样貌。
最后,请注意,《C++标准库(第2版)》有个困扰:虽然份量上由800页成长到超过1100页,我还是无法完整呈现C++标准库。标准库中单单针对C++11就有大约750页的描述,都是十分精练的文字,没有太多说明。基于这个原因,我必须取舍哪些特性需要描述,并决定以怎样的粒度描述之。再一次,C++社区中的许多人帮助我做出决定。我的企图集中在普通程序员需要的东西。若干《C++标准库(第2版)》舍弃的部分被我做成一份补充篇章放在《C++标准库(第2版)》官网乨乴乴买为丯丯乷乷乷丮乣买买乳乴乤乬乩乢丮乣乯乭。即便如此,你还是会在C++标准规格书中找到我未曾讨论的细节。
教学的艺术,并非体现在“呈现每一面”,而是一种“沙里淘金”的艺术,从中取得最大价值。但愿我是成功的。









