注册 | 登录读书好,好读书,读好书!
读书网-DuShu.com
当前位置: 首页出版图书科学技术计算机/网络软件与程序设计学习C++20(中文版)

学习C++20(中文版)

学习C++20(中文版)

定 价:¥238.00

作 者: [美]保罗·J.戴特尔(Paul J. Deitel),[美] 哈维·M.戴特尔(Harvey M. Deitel)著,周靖 译
出版社: 清华大学出版社
丛编项:
标 签: 暂缺

购买这本书可以去


ISBN: 9787302625438 出版时间: 2023-05-01 包装: 平装-胶订
开本: 16开 页数: 字数:  

内容简介

  《学习C 20(中文版)》共18章5个附录,讨论了C 20的5大编程模型:程序化编程、函数式编程、面向对象编程、泛型编程和模板元编程。第I部分介绍基础知识,第II部分介绍容器、C 20范围、指针、字符串和文件,第III部分介绍现代面向对象编程和异常,第Ⅳ部分介绍泛型编程、模板、概念和模板元编程,第V部分介绍高级主题,包括模块、并行算法、并发和协程。 《学习C 20(中文版)》适合需要了解C 20新特性的程序员,包括零基础或有经验的C 程序员以及其他想要了解C 的程序员,也适合希望开课教C 20的老师。

作者简介

  保罗·J.戴特尔(Paul J. Deitel)毕业于麻省理工学院(MIT),有42年计算机行业的工作经验。他是全球知名的编程语言培训师之一,自1992年以来一直在为软件开发人员讲授专业课程。他与哈维·M.戴特尔(Harvey M. Deitel)博士共同编写了全球最畅销的编程教材、专业书籍、视频和互动多媒体电子学习内容。

图书目录

第Ⅰ部分 编程基础
第1章 免费、流行的C 编译器 003
第2章 C 编程入门 025
第3章 控制语句(上) 045
第4章 控制语句(下) 077
第5章 函数和函数模板入门 113
第Ⅱ部分 数组、指针和字符串
第6章 数组、向量、范围和函数式编程 171
第7章 现代C 对指针的淡化 211
第8章 string、string_view、文本文件、CSV文件和正则表达式 247
第Ⅲ部分 面向对象程序设计
第9章 自定义类 303
第10章 OOP:继承和运行时多态性 379
第11章 操作符重载、拷贝/移动语义和智能指针 467
第12章 异常和对契约的展望 527
第Ⅳ部分 标准库容器、迭代器和算法
第13章 标准库容器和迭代器 571
第14章 标准库算法和C 20范围/视图 625
第Ⅴ部分 高级编程主题
第15章 模板、C 20“概念”和元编程 703
第16章 C 20模块:大规模开发 797
第17章 并行算法和并发性:高级观点 851
第18章 C 20协程 994
附录A 操作符优先级和分组 969
附录B 字符集 971
详细目录
第Ⅰ部分 编程基础
第1章 免费、流行的C 编译器
1.1 导读 004
1.2 试运行一个C 20应用程序 005
1.2.1 在Windows上用VS 2022社区版编译和运行C 20应用程序 005
1.2.2 在macOS上用Xcode编译和运行C 20应用程序 009
1.2.3 在Linux上用GNU C 运行C 20应用程序 013
1.2.4 在GCC Docker容器中编译和运行C 20应用程序 015
1.2.5 在Docker容器中使用clang 来编译和运行C 20应用程序 016
1.3 摩尔定律、多核处理器和并发编程 018
1.4 面向对象简单回顾 019
1.5 小结 021
第2章 C 编程入门
2.1 导读 026
2.2 第一个C 程序:显示单行文本 026
2.3 修改第一个C 程序 030
2.4 另一个C 程序:整数相加 031
2.5 算术运算 035
2.6 决策:相等性和关系操作符 036
2.7 对象自然案例学习:创建和使用标准库类string的对象 040
2.8 小结 044
第3章 控制语句(上)
3.1 导读 046
3.2 控制结构 046
3.2.1 顺序结构 046
3.2.2 选择语句 047
3.2.3 循环语句 048
3.2.4 控制语句小结 049
3.3 if选择语句 049
3.4 if…else双选语句 050
3.4.1 嵌套if…else语句 051
3.4.2 代码块 052
3.4.3 条件操作符( :) 053
3.5 while循环语句 053
3.6 计数器控制的循环 054
3.6.1 实现计数器控制的循环 054
3.6.2 整数除法和截断 056
3.7 哨兵值控制的循环 056
3.7.1 实现哨兵值控制的循环 057
3.7.2 基础类型之间的显式和隐式转换 059
3.7.3 格式化浮点数 060
3.8 嵌套控制语句 061
3.8.1 问题陈述 061
3.8.2 实现程序 062
3.8.3 用大括号初始化防止收缩转换 064
3.9 复合赋值操作符 065
3.10 递增和递减操作符 065
3.11 基本类型不可移植 068
3.12 对象自然案例学习:任意大小的整数 068
3.13 C 20:用format函数格式化文本 073
3.14 小结 075
第4章 控制语句(下)
4.1 导读 078
4.2 计数器控制的循环的本质 078
4.3 for循环语句 079
4.4 for循环的例子 081
4.5 应用程序:累加偶数整数 082
4.6 应用程序:复利计算 083
4.7 do…while循环语句 087
4.8 switch多选语句 088
4.9 使用带初始化器的C 17选择语句 094
4.10 break语句和continue语句 095
4.11 逻辑操作符 097
4.11.1 逻辑AND(&&)操作符 098
4.11.2 逻辑OR(||)操作符 098
4.11.3 短路求值 099
4.11.4 逻辑非(!)操作符 099
4.11.5 示例:生成逻辑操作符真值表 100
4.12 混淆相等性(==)和赋值(=)操作符 102
4.13 对象自然案例学习:使用miniz-cpp库读写ZIP文件8 103
4.14 用域宽和精度进行C 20文本格式化 108
4.15 小结 110
第5章 函数和函数模板入门
5.1 导读 114
5.2 C 程序组件 114
5.3 数学库函数 115
5.4 函数定义和函数原型 117
5.5 函数实参的求值顺序 120
5.6 函数原型和实参强制类型转换的有关注意事项 120
5.6.1 函数签名和函数原型 121
5.6.2 实参强制类型转换 121
5.6.3 实参提升规则和隐式转换 121
5.7 C 标准库头文件 123
5.8 案例学习:随机数生成 126
5.8.1 掷六面骰子 127
5.8.2 六面骰子掷6000万次 127
5.8.3 为给随机数生成器提供种子 129
5.8.4 用random_device为随机数生成器提供种子 131
5.9 案例学习:概率游戏,介绍有作用域的enum  131
5.10 作用域规则 137
5.11 内联函数 142
5.12 引用和引用参数 143
5.13 默认参数 146
5.14 一元作用域解析操作符 147
5.15 函数重载 148
5.16 函数模板 152
5.17 递归 155
5.18 递归示例:斐波那契数列 158
5.19 对比递归和循环 161
5.20 Lnfylun Lhqtomh Wjtz Qarcv: Qjwazkrplm xzz Xndmwwqhlz 163
5.21 小结 166
第Ⅱ部分 数组、指针和字符串
第6章 数组、向量、范围和函数式编程
6.1 导读 172
6.2 数组 172
6.3 声明数组 173
6.4 用循环初始化数组元素 173
6.5 用初始化器列表初始化数组 176
6.6 C 11基于范围的for和C 20带初始化器的基于范围的for 177
6.7 计算数组元素值并理解constexpr 180
6.8 累加数组元素 182
6.9 使用简陋的条形图以图形方式显示数组数据 182
6.10 数组元素作为计数器使用 184
6.11 使用数组来汇总调查结果 186
6.12 数组排序和查找 187
6.13 多维数组 189
6.14 函数式编程入门 194
6.14.1 做什么和怎么做 194
6.14.2 函数作为实参传给其他函数:理解lambda表达式 195
6.14.3 过滤器、映射和归约:理解C 20的“范围”库 197
6.15 对象自然案例学习:C 标准库类模板vector 201
6.16 小结 208
第7章 现代C 对指针的淡化
7.1 导读 212
7.2 声明和初始化指针变量 213
7.2.1 声明指针 214
7.2.2 初始化指针 214
7.2.3 C 11之前的空指针 214
7.3 指针操作符 214
7.3.1 取址(&)操作符 215
7.3.2 间接寻址(*)操作符 215
7.3.3 使用取址(&)和间接寻址(*)操作符 216
7.4 用指针传引用 217
7.5 内置数组 221
7.5.1 声明和访问内置数组 222
7.5.2 初始化内建数组 222
7.5.3 向函数传递内置数组 222
7.5.4 声明内置数组参数 223
7.5.5 C 11标准库函数begin和end 223
7.5.6 内置数组的限制 223
7.6 使用C 20 to_array将内置数组转换成std::array 224
7.7 为指针和它指向的数据使用const 225
7.7.1 指向非常量数据的非常量指针 226
7.7.2 指向常量数据的非常量指针 226
7.7.3 指向非常量数据的常量指针 227
7.7.4 指向常量数据的常量指针 228
7.8 sizeof操作符 229
7.9 指针表达式和指针算术 232
7.9.1 在指针上加减整数 232
7.9.2 从指针上减一个指针 233
7.9.3 指针赋值 234
7.9.4 不能解引用void* 234
7.9.5 指针比较 234
7.10 对象自然案例学习:C 20 span,连续容器元素的视图 234
7.11 理解基于指针的字符串 240
7.11.1 命令行参数 242
7.11.2 再论C 20的to_array函数 243
7.12 展望其他指针主题 244
7.13 小结 245
第8章 string、string_view、文本文件、CSV文件和正则表达式
8.1 导读 248
8.2 字符串赋值和连接 249
8.3 字符串比较 251
8.4 子串 253
8.5 交换字符串 254
8.6 收集string特征信息 254
8.7 在字符串中查找子串和字符 257
8.8 替换和删除字符串中的字符 260
8.9 在字符串中插入字符 262
8.10 C 11数值转换 263
8.11 C 17 string_view 264
8.12 文件和流 267
8.13 创建顺序文件 268
8.14 从顺序文件读取数据 271
8.15 C 14读取和写入引号文本 274
8.16 更新顺序文件 275
8.17 字符串流处理 276
8.18 原始字符串字面值 279
8.19 对象自然案例学习:读取和分析包含泰坦尼克号灾难数据的CSV文件 280
8.19.1 使用 rapidcsv 读取 CSV 文件的内容 280
8.19.2 读取和分析泰坦尼克号灾难数据集 282
8.20 对象自然案例学习:理解正则表达式 290
8.20.1 将完整字符串与模式相匹配 291
8.20.2 替换子串 296
8.20.3 查找匹配 296
8.21 小结 299
第Ⅲ部分 面向对象程序设计
第9章 自定义类
9.1 导读 304
9.2 体验Account对象 304
9.3 具有赋值和取值成员函数的Account类 306
9.3.1 类定义 306
9.3.2 访问说明符private和public 309
9.4 Account类:自定义构造函数 309
9.5 赋值和取值成员函数的软件工程优势 313
9.6 含有余额的Account类 314
9.7 Time类案例学习:分离接口与实现 318
9.7.1 类的接口 319
9.7.2 分离接口与实现 319
9.7.3 类定义 320
9.7.4 成员函数 321
9.7.5 在源代码文件中包含类的头文件 322
9.7.6 作用域解析操作符(::) 322
9.7.7 成员函数setTime和抛出异常 323
9.7.8 成员函数to24HourString和to12HourString 323
9.7.9 隐式内联的成员函数 324
9.7.10 成员函数与全局函数 324
9.7.11 使用Time类 324
9.7.12 对象的大小 326
9.8 编译和链接过程 326
9.9 类作用域以及对类成员的访问 327
9.10 访问函数和实用函数 328
9.11 Time类案例学习:带有默认参数的构造函数 329
9.11.1 Time类 329
9.11.2 重载构造函数和C 11委托构造函数 334
9.12 析构函数 335
9.13 什么时候调用构造函数和析构函数 335
9.14 Time类案例学习:返回到private数据成员的引用或指针时,须谨慎 339
9.15 默认赋值操作符 342
9.16 const对象和const成员函数 344
9.17 合成:对象作为类成员 346
9.18 友元函数和友元类 351
9.19 this指针 353
9.19.1 隐式和显式使用this指针访问对象的数据成员 354
9.19.2 使用this指针来实现级联函数调用 355
9.20 静态类成员:类级数据和成员函数 359
9.21 C 20中的聚合 364
9.21.1 初始化聚合 365
9.21.2 C 20:指定初始化器 365
9.22 对象自然案例学习:用JSON序列化 366
9.22.1 序列化由包含public数据的对象构成的vector 367
9.22.2 序列化由包含private数据的对象构成的vector 372
9.23 小结 374
第10章 OOP:继承和运行时多态性
10.1 导读 380
10.2 基类和派生类 382
10.2.1 CommunityMember类层次结构 383
10.2.2 Shape类层次结构和public继承 384
10.3 基类和派生类的关系 385
10.3.1 创建和使用SalariedEmployee类 385
10.3.2 创建SalariedEmployee/SalariedCommissionEmployee继承层次结构 388
10.4 派生类中的构造函数和析构函数 394
10.5 运行时多态性入门:多态性电子游戏 395
10.6 继承层次结构中对象之间的关系 396
10.6.1 从派生类对象调用基类函数 397
10.6.2 派生类指针指向基类对象 400
10.6.3 通过基类指针调用派生类成员函数 401
10.7 虚函数和虚析构函数 403
10.7.1 为什么虚函数这么有用? 403
10.7.2 声明虚函数 403
10.7.3 调用虚函数 403
10.7.4 SalariedEmployee层次结构中的虚函数 404
10.7.5 虚析构函数 408
10.7.6 final成员函数和类 408
10.8 抽象类和纯虚函数 409
10.8.1 纯虚函数 409
10.8.2 设备驱动程序:操作系统中的多态性 410
10.9 案例学习:使用运行时多态性的薪资系统 410
10.9.1 创建抽象基类Employee 411
10.9.2 创建派生的具体类SalariedEmployee 414
10.9.3 创建派生的具体类CommissionEmployee 416
10.9.4 演示运行时多态性处理 418
10.10 运行时多态性、虚函数和动态绑定的幕后机制 421
10.11 非虚接口(NVI)惯用法 425
10.12 藉由接口来编程,而不要藉由实现26 432
10.12.1 重新思考Employee层次结构:CompensationModel接口 434
10.12.2 Employee类 434
10.12.3 实现CompensationModel 436
10.12.4 测试新层次结构 439
10.12.5 依赖注入在设计上的优势 440
10.13 使用std::variant和std::visit实现运行时多态性 441
10.14 多继承 447
10.14.1 菱形继承 452
10.14.2 用虚基类继承消除重复的子对象 454
10.15 深入理解protected类成员 456
10.16 public、protected和private继承 457
10.17 更多运行时多态性技术和编译时多态性 458
10.17.1 其他运行时多态性技术 458
10.17.2 编译时(静态)多态性技术 460
10.17.3 其他多态性概念 461
10.18 小结 461
第11章 操作符重载、拷贝/移动语义和智能指针
11.1 导读 468
11.2 使用标准库string类的重载操作符 470
11.3 操作符重载基础 476
11.3.1 操作符不会自动重载 476
11.3.2 不能重载的操作符 476
11.3.3 不必重载的操作符 476
11.3.4 操作符重载的规则和限制 477
11.4 用new和delete进行动态内存管理(过时技术) 477
11.5 现代C 动态内存管理:RAII和智能指针 480
11.5.1 智能指针 480
11.5.2 演示unique_ptr 480
11.5.3 unique_ptr的所有权 482
11.5.4 指向内置数组的unique_ptr 482
11.6 MyArray案例学习:通过操作符重载来打造有价值的类 483
11.6.1 特殊成员函数 484
11.6.2 使用MyArray类 485
11.6.3 MyArray类定义 495
11.6.4 指定了MyArray大小的构造函数 496
11.6.5 C 11向构造函数传递一个大括号初始化器 497
11.6.6 拷贝构造函数和拷贝赋值操作符 498
11.6.7 移动构造函数和移动赋值操作符 502
11.6.8 析构函数 504
11.6.9 toString和size函数 505
11.6.10 重载相等性(==)和不相等(!=)操作符 506
11.6.11 重载下标([])操作符 508
11.6.12 重载一元bool转换操作符 509
11.6.13 重载前递增操作符 509
11.6.14 重载后递增操作符 510
11.6.15 重载加赋值操作符( =) 511
11.6.16 重载二元流提取(>>)和流插入(
11.6.17 友元函数swap 514
11.7 C 20三路比较操作符() 515
11.8 类型之间的转换 518
11.9 explicit构造函数和转换操作符 519
11.10 重载函数调用操作符() 522
11.11 小结 522
第12章 异常和对契约的展望
12.1 导读 528
12.2 异常处理控制流 531
12.2.1 定义一个异常类来表示可能发生的问题类型 531
12.2.2 演示异常处理 532
12.2.3 将代码封闭到try块中 533
12.2.4 为DivideByZeroException定义catch处理程序 534
12.2.5 异常处理的终止模型 535
12.2.6 用户输入非零分母时的控制流 535
12.2.7 用户输入零分母时的控制流 535
12.3 异常安全保证和noexcept 536
12.4 重新抛出异常 537
12.5 栈展开和未捕捉的异常 539
12.6 什么时候使用异常处理 541
12.6.1 assert宏 542
12.6.2 快速失败 543
12.7 构造函数、析构函数和异常处理 543
12.7.1 从构造函数抛出异常 543
12.7.2 通过函数try块在构造函数中捕获异常 544
12.7.3 异常和析构函数:再论noexcept(false) 546
12.8 处理new的失败 547
12.8.1 new在失败时抛出bad_alloc 548
12.8.2 new在失败时返回nullptr 549
12.8.3 使用set_new_handler函数处理new的失败 549
12.9 标准库异常层次结构 551
12.10 C 的finally块替代方案:资源获取即初始化(RAII) 553
12.11 一些库同时支持异常和错误码 554
12.12 日志记录 555
12.13 展望“契约” 555
12.14 小结 563
第Ⅳ部分 标准库容器、迭代器和算法
第13章 标准库容器和迭代器
13.1 导读 572
13.2 容器简介 574
13.2.1 序列和关联式容器中的通用嵌套类型 575
13.2.2 通用容器成员和非成员函数 576
13.2.3 对容器元素的要求 578
13.3 使用迭代器 579
13.3.1 使用istream_iterator进行输入,使用ostream_iterator进行输出 579
13.3.2 迭代器的类别 580
13.3.3 容器对迭代器的支持 581
13.3.4 预定义迭代器类型名称 582
13.3.5 迭代器操作符 582
13.4 算法简介 583
13.5 序列容器 584
13.6 vector序列容器 584
13.6.1 使用vector和迭代器 585
13.6.2 vector元素处理函数 589
13.7 list顺序容器 593
13.8 deque序列容器 598
13.9 关联式容器 600
13.9.1 multiset关联式容器 600
13.9.2 set关联式容器 605
13.9.3 multimap关联式容器 607
13.9.4 map关联式容器 609
13.10 容器适配器 611
13.10.1 stack适配器 611
13.10.2 queue适配器 613
13.10.3 priority_queue适配器 614
13.11 bitset近似容器 616
13.12 选读:Big O简介 618
13.13 选读:哈希表简介 621
13.14 小结 622
第14章 标准库算法和C 20范围/视图
14.1 导读 626
14.2 算法要求:C 20“概念” 627
14.3 lambda和算法 629
14.4 算法 633
14.4.1 fill、fill_n、generate和generate_n 633
14.4.2 equal、mismatch和lexicographical_compare 636
14.4.3 remove、remove_if、remove_copy和remove_copy_if 639
14.4.4 replace、replace_if、replace_copy和replace_copy_if 643
14.4.5 打散、计数和最小/最大元素算法 645
14.4.6 查找和排序算法 649
14.4.7 swap、iter_swap和swap_ranges 654
14.4.8 copy_backward、merge、unique、reverse、copy_if和copy_n 656
14.4.9 inplace_merge、unique_copy和reverse_copy 660
14.4.10 集合操作 662
14.4.11 lower_bound、upper_bound和equal_range 665
14.4.12 min、max和minmax 667
14.4.13 来自头文件的算法gcd、lcm、iota、reduce和partial_sum 669
14.4.14 堆排序和优先队列 672
14.5 函数对象(仿函数) 677
14.6 投射 682
14.7 C 20视图和函数式编程 685
14.7.1 范围适配器 685
14.7.2 使用范围适配器和视图 686
14.8 并行算法简介 691
14.9 标准库算法小结 693
14.10 C 23“范围”前瞻 696
14.11 小结 696
第Ⅴ部分 高级编程主题
第15 章 模板、C 20“概念”和元编程 703
15.1 导读 704
15.2 自定义类模板和编译时多态性 707
15.3 C 20对函数模板的增强 712
15.3.1 C 20缩写函数模板 712
15.3.2 C 20模板化lambda 714
15.4 C 20“概念”初探 714
15.4.1 无约束的函数模板multiply 715
15.4.2 带有C 20“概念”的requires子句的有约束的函数模板 718
15.4.3 C 20预定义概念 721
15.5 类型traits 722
15.6 C 20概念:深入了解 728
15.6.1 创建自定义概念 728
15.6.2 使用概念 728
15.6.3 在缩写函数模板中使用概念 729
15.6.4 基于概念的重载 731
15.6.5 requires表达式 733
15.6.6 C 20仅供参详的概念 736
15.6.7 C 20“概念”之前的技术:SFINAE和Tag Dispatch 738
15.7 用static_assert测试C 20概念 738
15.8 创建自定义算法 741
15.9 创建自定义容器和迭代器 743
15.9.1 类模板ConstIterator 745
15.9.2 类模板Iterator 748
15.9.3 类模板MyArray 751
15.9.4 针对大括号初始化的MyArray推导指引 754
15.9.5 将MyArray及其自定义迭代器用于std::ranges算法 756
15.10 模板类型参数的默认实参 760
15.11 变量模板 761
15.12 可变参数模板和折叠表达式 761
15.12.1 tuple可变参数类模板 761
15.12.2 可变参数函数模板和C 17折叠表达式简介 765
15.12.3 折叠表达式的类型 769
15.12.4 一元折叠表达式如何应用它们的操作符 769
15.12.5 二元折叠表达式如何应用它们的操作符 772
15.12.6 使用逗号操作符重复执行一个操作 774
15.12.7 将参数包中的元素约束为同一类型 774
15.13 模板元编程 777
15.13.1 C 模板是图灵完备的 778
15.13.2 在编译时计算值 778
15.13.3 用模板元编程和constexpr if进行条件编译 783
15.13.4 类型元函数 785
15.14 小结 789
第16章 C 20模块:大规模开发
16.1 导读 798
16.2 C 20之前的编译和链接 799
16.3 模块的优点与目标 800
16.4 示例:过渡到模块——头单元 801
16.5 模块可以减少翻译单元的大小和编译时间 804
16.6 示例:创建并使用模块 805
16.6.1 模块接口单元的module声明 806
16.6.2 导出声明 808
16.6.3 导出一组声明 808
16.6.4 导出命名空间 808
16.6.5 导出命名空间的成员 809
16.6.6 导入模块以使用其导出的声明 809
16.6.7 示例:试图访问未导出的模块内容 811
16.7 全局模块片断 814
16.8 将接口与实现分开 814
16.8.1 示例:模块实现单元 815
16.8.2 示例:模块化一个类 818
16.8.3 :private模块片断 821
16.9 分区 822
16.9.1 示例:模块接口分区单元 822
16.9.2 模块实现分区单元 825
16.9.3 示例:“子模块”和分区 825
16.10 其他模块示例 830
16.10.1 示例:将C 标准库作为模块导入 831
16.10.2 示例:不允许循环依赖 832
16.10.3 示例:导入不具传递性 833
16.10.4 示例:可见性和可达性 834
16.11 将代码迁移到模块 836
16.12 模块和模块工具的未来 837
16.13 小结 838
第17章 并行算法和并发性:高级观点
17.1 导读 852
17.2 标准库并行算法(C 17) 855
17.2.1 示例:分析顺序排序和并行排序算法 855
17.2.2 什么时候使用并行算法 858
17.2.3 执行策略 859
17.2.4 示例:分析并行化和矢量化运算 859
17.2.5 并行算法的其他注意事项 862
17.3 多线程编程 863
17.3.1 线程状态和线程生命周期 863
17.3.2 死锁和无限期推迟 865
17.4 用std::jthread启动线程 867
17.4.1 定义在线程中执行的任务 868
17.4.2 在一个jthread中执行任务 869
17.4.3 jthread对thread的修正 872
17.5 生产者-消费者关系:首次尝试 873
17.6 生产者-消费者:同步对共享可变数据的访问 881
17.6.1 SynchronizedBuffer类:互斥体、锁和条件变量 882
17.6.2 测试SynchronizedBuffer 889
17.7 生产者-消费者:用循环缓冲区最小化等待时间 894
17.8 读者和写者 904
17.9 协作式取消jthread 905
17.10 用std::async启动任务 909
17.11 线程安全的一次性初始化 916
17.12 原子类型简介 917
17.13 用C 20闭锁和栅栏来协同线程 921
17.13.1 C 20 std::latch 921
17.13.2 C 20 std::barrier 924
17.14 C 20信号量 928
17.15 C 23:C 并发性未来展望 932
17.15.1 并行范围算法 932
17.15.2 并发容器 932
17.15.3 其他和并发性相关的提案 933
17.16 小结 933
第18章 C 20协程
18.1 导读 942
18.2 协程支持库 943
18.3 安装concurrencpp和generator库 944
18.4 用co_yield和generator库创建生成器协程 944
18.5 用concurrencpp启动任务 948
18.6 用co_await和co_return创建协程 953
18.7 低级协程概念 962
18.8 C 23的协程改进计划 964
18.9 小结 964
附录A 操作符优先级和分组 969
附录B 字符集

本目录推荐