Skip to content

Commit 832c622

Browse files
committed
fix: refine title number
1 parent 9e18543 commit 832c622

File tree

7 files changed

+30
-113
lines changed

7 files changed

+30
-113
lines changed

book/zh-cn/03-runtime.md

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,9 @@ order: 3
88

99
> 内容修订中
1010
11-
## 一、本节内容
12-
13-
本节内容包括:
14-
15-
* 语言运行期的强化
16-
* lambda 表达式
17-
* lambda 表达式基础
18-
* 值捕获
19-
* 引用捕获
20-
* 隐式捕获
21-
* 表达式捕获
22-
* 泛型 lambda
23-
* 函数对象包装器
24-
* std::function
25-
* std::bind/std::placeholder
26-
* 右值引用
27-
* 左值、右值的纯右值、将亡值、右值
28-
* 右值引用和左值引用
29-
* 移动语义
30-
* 完美转发
31-
32-
## 二、Lambda 表达式
11+
[TOC]
12+
13+
## 3.1 Lambda 表达式
3314

3415
Lambda 表达式是 C++11 中最重要的新特性之一,而 Lambda 表达式,实际上就是提供了一个类似匿名函数的特性,而匿名函数则是在需要一个函数,但是又不想费力去命名一个函数的情况下去使用的。这样的场景其实有很多很多,所以匿名函数几乎是现代编程语言的标配。
3516

@@ -131,7 +112,7 @@ add(1, 2);
131112
add(1.1, 2.2);
132113
```
133114
134-
## 二、函数对象包装器
115+
## 3.2 函数对象包装器
135116
136117
这部分内容虽然属于标准库的一部分,但是从本质上来看,它却增强了 C++ 语言运行时的能力,这部分内容也相当重要,所以放到这里来进行介绍。
137118
@@ -200,7 +181,7 @@ int main() {
200181

201182
> **提示:**注意 `auto` 关键字的妙用。有时候我们可能不太熟悉一个函数的返回值类型,但是我们却可以通过 `auto` 的使用来规避这一问题的出现。
202183
203-
## 三、右值引用
184+
## 3.3 右值引用
204185

205186
右值引用是 C++11 引入的与 Lambda 表达式齐名的重要特性之一。它的引入解决了 C++ 中大量的历史遗留问题,消除了诸如 `std::vector``std::string` 之类的额外开销,也才使得函数对象容器 `std::function` 成为了可能。
206187

book/zh-cn/04-containers.md

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,9 @@ order: 4
88

99
> 内容修订中
1010
11-
## 一、本节内容
11+
[TOC]
1212

13-
本节内容包括:
14-
15-
* 对标准库的扩充: 新增容器
16-
* `std::byte`
17-
* `std::any` `std::optional` `std::variant`
18-
* `std::string_view`
19-
* `std::array`
20-
* `std::forward_list`
21-
* `std::unordered_set`
22-
* `std::unordered_map`
23-
* `std::tuple`
24-
* 基本操作
25-
* 运行期索引
26-
* 合并与迭代
27-
28-
## 二、std::array 和 std::forward\_list
13+
## 4.1 std::array 和 std::forward\_list
2914

3015
### std::array
3116

@@ -71,7 +56,7 @@ std::sort(arr.begin(), arr.end());
7156

7257
需要知道的是,和 `std::list` 的双向链表的实现不同,`std::forward_list` 使用单向链表进行实现,提供了 `O(1)` 复杂度的元素插入,不支持快速随机访问(这也是链表的特点),也是标准库容器中唯一一个不提供 `size()` 方法的容器。当不需要双向迭代时,具有比 `std::list` 更高的空间利用率。
7358

74-
## 三、无序容器
59+
## 4.2 无序容器
7560

7661
我们已经熟知了传统 C++ 中的有序容器 `std::map`/`std::set`,这些元素内部通过红黑树进行实现,插入和搜索的平均复杂度均为 `O(log(size))`。在插入元素时候,会根据 `<` 操作符比较元素大小并判断元素是否相同,并选择合适的位置插入到容器中。当对这个容器中的元素进行遍历时,输出结果会按照 `<` 操作符的顺序来逐个遍历。
7762

@@ -126,7 +111,7 @@ Key:[2] Value:[2]
126111
Key:[3] Value:[3]
127112
```
128113

129-
## 四、元组 std::tuple
114+
## 4.3 元组 std::tuple
130115

131116
了解过 Python 的程序员应该知道元组的概念,纵观传统 C++ 中的容器,除了 `std::pair` 外,似乎没有现成的结构能够用来存放不同类型的数据(通常我们会自己定义结构)。但 `std::pair` 的缺陷是显而易见的,只能保存两个元素。
132117

book/zh-cn/05-pointers.md

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,9 @@ order: 5
88

99
> 内容修订中
1010
11-
## 一、本节内容
11+
[TOC]
1212

13-
本节内容包括:
14-
15-
- 对标准库的扩充: 智能指针和引用计数
16-
+ RAII 与引用计数
17-
+ `std::shared_ptr`
18-
+ `std::unique_ptr`
19-
+ `std::weak_ptr`
20-
21-
## 二、RAII 与引用计数
13+
## 5.1 RAII 与引用计数
2214

2315
了解 `Objective-C`/`Swift` 的程序员应该知道引用计数的概念。引用计数这种计数是为了防止内存泄露而产生的。基本想法是对于动态分配的对象,进行引用计数,每当增加一次对同一个对象的引用,那么引用对象的引用计数就会增加一次,每删除一次引用,引用计数就会减一,当一个对象的引用计数减为零时,就自动删除指向的堆内存。
2416

@@ -28,7 +20,7 @@ order: 5
2820

2921
> 注意:引用计数不是垃圾回收,引用技术能够尽快收回不再被使用的对象,同时在回收的过程中也不会造成长时间的等待,更能够清晰明确的表明资源的生命周期。
3022
31-
## 三、std::shared_ptr
23+
## 5.2 std::shared_ptr
3224

3325
`std::shared_ptr` 是一种智能指针,它能够记录多少个 `shared_ptr` 共同指向一个对象,从而消除显示的调用 `delete`,当引用计数变为零的时候就会将对象自动删除。
3426

@@ -78,8 +70,7 @@ std::cout << "pointer2.use_count() = " << pointer2.use_count() << std::endl; //
7870
std::cout << "pointer3.use_count() = " << pointer3.use_count() << std::endl; // 0, pointer3 已 reset
7971
```
8072

81-
82-
## 四、std::unique_ptr
73+
## 5.3 std::unique_ptr
8374

8475
`std::unique_ptr` 是一种独占的智能指针,它禁止其他智能指针与其共享同一个对象,从而保证代码的安全:
8576

@@ -138,7 +129,7 @@ int main() {
138129
}
139130
```
140131
141-
## 五、std::weak_ptr
132+
## 5.4 std::weak_ptr
142133
143134
如果你仔细思考 `std::shared_ptr` 就会发现依然存在着资源无法释放的问题。看下面这个例子:
144135

book/zh-cn/06-regex.md

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,9 @@ order: 6
88

99
> 内容修订中
1010
11-
## 一、本节内容
11+
[TOC]
1212

13-
本节内容包括:
14-
15-
- 对标准库的扩充: 正则表达式库
16-
+ 正则表达式简介
17-
+ 普通字符
18-
+ 特殊字符
19-
+ 限定符
20-
+ `std::regex` 及其相关
21-
+ `std::regex`
22-
+ `std::regex_match`
23-
+ `std::match_results`
24-
25-
## 二、正则表达式简介
13+
## 6.1 正则表达式简介
2614

2715
正则表达式不是 C++ 语言的一部分,这里仅做简单的介绍。
2816

@@ -73,7 +61,7 @@ order: 6
7361

7462
有了这三张表,我们通常就能够读懂几乎所有的正则表达式了。
7563

76-
## 三、std::regex 及其相关
64+
## 6.2 std::regex 及其相关
7765

7866
对字符串内容进行匹配的最常见手段就是使用正则表达式。可惜在传统 C++ 中正则表达式一直没有得到语言层面的支持,没有纳入标准库,而 C++ 作为一门高性能语言,在后台服务的开发中,对 URL 资源链接进行判断时,使用正则表达式也是工业界最为成熟的普遍做法。
7967

book/zh-cn/07-thread.md

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,9 @@ order: 7
88

99
> 内容修订中
1010
11-
## 一、本节内容
11+
[TOC]
1212

13-
本节内容包括:
14-
15-
* 对标准库的扩充: 语言级线程支持
16-
* std::thread
17-
* std::mutex/std::unique\_lock
18-
* std::future/std::packaged\_task
19-
* std::condition\_variable
20-
21-
## 二、std::thread
13+
## 7.1 std::thread
2214

2315
`std::thread` 用于创建一个执行的线程实例,所以它是一切并发编程的基础,使用时需要包含 `<thread>` 头文件,它提供了很多基本的线程操作,例如`get_id()`来获取所创建线程的线程 ID,例如使用 `join()` 来加入一个线程等等,例如:
2416

@@ -35,7 +27,7 @@ int main() {
3527
}
3628
```
3729

38-
## 三、 std::mutex, std::unique\_lock
30+
## 7.2 std::mutex, std::unique\_lock
3931

4032
我们在操作系统的相关知识中已经了解过了有关并发技术的基本知识,mutex 就是其中的核心之一。C++11引入了 mutex 相关的类,其所有相关的函数都放在 `<mutex>` 头文件中。
4133

@@ -88,7 +80,7 @@ int main() {
8880
}
8981
```
9082

91-
#### std::future, std::packaged\_task
83+
## 7.3 std::future, std::packaged\_task
9284

9385
`std::future` 则是提供了一个访问异步操作结果的途径,这句话很不好理解。为了理解这个特性,我们需要先理解一下在 C++11之前的多线程行为。
9486

@@ -121,7 +113,7 @@ int main()
121113

122114
在封装好要调用的目标后,可以使用 `get_future()` 来获得一个 `std::future` 对象,以便之后实施线程同步。
123115

124-
#### std::condition\_variable
116+
## 7.4 std::condition_variable
125117

126118
`std::condition_variable` 是为了解决死锁而生的。当互斥操作不够用而引入的。比如,线程可能需要等待某个条件为真才能继续执行,而一个忙等待循环中可能会导致所有其他线程都无法进入临界区使得条件为真时,就会发生死锁。所以,`condition_variable` 实例被创建出现主要就是用于唤醒等待线程从而避免死锁。`std::condition_variable``notify_one()` 用于唤醒一个线程;`notify_all()` 则是通知所有线程。下面是一个生产者和消费者模型的例子:
127119

book/zh-cn/09-others.md

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,15 @@ order: 9
88

99
> 内容修订中
1010
11-
## 一、本节内容
11+
[TOC]
1212

13-
本节内容包括:
14-
15-
- 对标准库的扩充: 其他杂项
16-
+ 新类型
17-
+ `long long int`
18-
+ `noexcept` 的修饰和操作
19-
+ 字面量
20-
+ 原始字符串字面量
21-
+ 自定义字面量
22-
23-
## 二、新类型
13+
## 9.1 新类型
2414

2515
### `long long int`
2616

2717
`long long int` 并不是 C++11 最先引入的,其实早在 C99,`long long int` 就已经被纳入 C 标准中,所以大部分的编译器早已支持。C++11 的工作则是正式把它纳入标准库,规定了一个 `long long int` 类型至少具备 64 位的比特数。
2818

29-
## 三、noexcept 的修饰和操作
19+
## 9.2 noexcept 的修饰和操作
3020

3121
C++ 相比于 C 的一大优势就在于 C++ 本身就定义了一套完整的异常处理机制。然而在 C++11 之前,几乎没有人去使用在函数名后书写异常声明表达式,从 C++11 开始,这套机制被弃用,所以我们不去讨论也不去介绍以前这套机制是如何工作如何使用,你更不应该主动去了解它。
3222

@@ -99,7 +89,7 @@ std::cout << "捕获异常, 来自 block_throw()" << std::endl;
9989
捕获异常, 来自 non_block_throw()
10090
```
10191

102-
## 四、字面量
92+
## 9.3 字面量
10393

10494
### 原始字符串字面量
10595

book/zh-cn/10-cpp20.md

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,11 @@ order: 10
88

99
> 内容修订中, 目前内容为第一版中对 C++17 的展望
1010
11-
## 一、本节内容
12-
13-
本节内容包括:
14-
15-
- 扩展主题: C++17 简介
16-
+ 主要入选特性
17-
+ 非类型模板参数的 `auto`
18-
+ `std::variant<>`
19-
+ 变量声明的强化
20-
+ 未入选特性
21-
+ Concepts
11+
[TOC]
2212

2313
本章对即将到来的 C++17 进行介绍,几个月前(2016 年),目前为止,还没有一个正式发布的编译器来编译 C++17 特性的代码,本节作为扩展主题,供对 C++ 的历史进程及其未来发展感兴趣的读者阅读。
2414

25-
## 二、主要入选特性
15+
## 10.1 主要入选特性
2616

2717
### 非类型模板参数的 auto
2818

@@ -85,7 +75,7 @@ std::variant<Args...> tuple_index(size_t i, const std::tuple<Args...>& tpl) {
8575
8676
8777
88-
## 三、未入选特性
78+
## 10.2 未入选特性
8979
9080
C++ 组委会在讨论投票最终确定 C++17 有很多提案,诸如 **Concepts**/**Ranges**/**Module** 等等,其中最受关注的就是 **Concepts**,可惜这一提案最终被拒,作为技术规范(Technical Specifications, TS) 将其发布。
9181
@@ -132,7 +122,7 @@ Concepts TS 的发布到最后一次 C++17 的讨论会只相隔了不到四个
132122
133123
总的来说,类似于 Concepts/Ranges/Modules 这些令人兴奋的特性并没有入选至 C++17,这注定了 C++17 某种意义上来说相较于 C++11/14 依然只是小幅度更新,但我们有望在 C++2x 中看到这些东西的出现,这些内容对于一门已经三十多岁『高龄』的编程语言,依然是充满魅力的。
134124
135-
[返回目录](./toc.md) | [上一章](./09-others.md) | [下一章 附录:进一步阅读的学习材料](./appendix.md)
125+
[返回目录](./toc.md) | [上一章](./09-others.md) | [下一章 附录:进一步阅读的学习材料](./appendix1.md)
136126
137127
138128
## 进一步阅读的参考资料

0 commit comments

Comments
 (0)