C++标准库和标准模板库

Oct 2, 2019

C1. 标准库中与语言支持功能相关的头文件

1.png

C2. 支持流输入/输出的头文件

2.png

C3. 与诊断功能相关的头文件

3.png

C4. 定义工具函数的头文件

4.png

C5. 支持字符串处理的头文件

5.png

C6. 定义容器类的模板的头文件

6.png

C7. 支持迭代器的头文件

7.png

C8. 有关算法的头文件

8.png

C9. 有关数值操作的头文件

9.png

C10. 有关本地化的头文件

10.png

C++标准库的所有头文件都没有扩展名。C++标准库以<cname>形式的标准头文件提供。在<cname>形式标准的头文件中,与宏相关的名称在全局作用域中定义,其他名称在std命名空间中声明。在C++中还可以使用name.h形式的标准C库头文件名。

二、算法、容器、迭代器

STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。

STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。在C++标准中,STL被组织为下面的13个头文件:
<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。

1、算法

函数库对数据类型的选择对其可重用性起着至关重要的作用。举例来说,一个求方根的函数,在使用浮点数作为其参数类型的情况下的可重用性肯定比使用整型作为它的参数类性要高。而C++通过模板的机制允许推迟对某些类型的选择,直到真正想使用模板或者说对模板进行特化的时候,STL就利用了这一点提供了相当多的有用算法。它是在一个有效的框架中完成这些算法的——可以将所有的类型划分为少数的几类,然后就可以在模版的参数中使用一种类型替换掉同一种类中的其他类型。

STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。这样一来,只要熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能并大大地提升效率。

算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。<algorithm>是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。<functional>中则定义了一些模板类,用以声明函数对象。

2、容器

在实际的开发过程中,数据结构本身的重要性不会逊于操作于数据结构的算法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加重要。

经典的数据结构数量有限,但是我们常常重复着一些为了实现向量、链表等结构而编写的代码,这些代码都十分相似,只是为了适应不同数据的变化而在细节上有所出入。STL容器就为我们提供了这样的方便,它允许我们重复利用已有的实现构造自己的特定类型下的数据结构,通过设置一些模版类,STL容器对最常用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类型,可以将我们许多重复而乏味的工作简化。

容器部分主要由头文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>组成。对于常用的一些容器和容器适配器(可以看作由其它容器实现的容器),可以通过下表总结一下它们和相应头文件的对应关系。

11.png

3、迭代器

迭代器从作用上来说是最基本的部分,可是理解起来比前两者都要费力一些。软件设计有一个基本原则,所有的问题都可以通过引进一个间接层来简化,这种简化在STL中就是用迭代器来完成的。概括来说,迭代器在STL中用来将算法和容器联系起来,起着一种黏和剂的作用。几乎STL提供的所有算法都是通过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。

迭代器部分主要由头文件<utility>,<iterator>和<memory>组成。<utility>是一个很小的头文件,它包括了贯穿使用在STL中的几个模板的声明,<iterator>中提供了迭代器使用的许多方法,而对于<memory>的描述则十分的困难,它以不同寻常的方式为容器中的元素分配存储空间,同时也为某些算法执行期间产生的临时对象提供机制,<memory>中的主要部分是模板类allocator,它负责产生所有容器中的默认分配器。

三、后记

对于STL的使用,也普遍存在着两种观点。第一种认为STL的最大作用在于充当经典的数据结构和算法教材,因为它的源代码涉及了许多具体实现方面的问题。第二种则认为STL的初衷乃是为了简化设计,避免重复劳动,提高编程效率,因此应该是“应用至上”的,对于源代码则不必深究。对于初学者而言,通过分析源代码,提高对其应用的理解其意义也不同凡响。

=========================================================

C++标准库函数 c++程序通常可以调用标准c++库中的大量函数。这些函数完成一些基本的服务,如输入和输出等,同时也为一些经常使用的操作提供了高效的 实现代码。这些函数中含有大量的函数和类定义,以帮助程序员更好地使用标准c++库。 标准c++库包含以下内容: <algorithm>,<bitset>,<complex>,<deque>,<exception>,<fstream>,<functionl>,<iomanip>,<ios>,<iosfwd>,<iostream>,<isteam>,<iterat or>,<limits>,<list>,<locale>,<map>,<memory>,<numeric>,<ostream>,<queue>,<set>,<sstream>,<stack>,<stdxcept>,<streambuf>,<strin ig>,<strstream>,<utility>,<valarray>,<vactor>,<cassert>,<cctype>,<cerron>,<cfloat>,<ciso646>,<climits>,<clocale>,<cmath>,<cse tjmp>,<csignal>,<cstdrag>,<cstddef>,<cstdio>,<cstdlibn>,<cstring>,<ctime>,<cwchar>,<iso646.h>和<cwchar.h> 标准c++库的详细消息均在其对应的头文件进行了说明。主要标准c++库头文件如下所示。其中13项为标准模板库(STL),在其说明文字的前面标有(STL)的为标准模板库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
<algorithm>---(STL)用于定义实现常用、实用算法的大量模板

<bitset>----- 用于定义官位位集合的模板类

<cassert>-----用于在程序执行时执行断言

<cctype>-----用于对字符进行分类

<cerrno>-----用于测试有库函数提交的错误代码

<cfloat>------用于测试浮点类型属性

<cios646>----用于在ISO646变体字符集中编程

<climits>-----用于测试整数类型属性

<clocale>-----用于使程序适应不同的文化风俗

<cmath>———用于计算常用的数学函数

<complex>-----用于定义支持复杂算法的模板类

<csetjmp>-----用于执行非局部的goto语句

<csignal>------用于控制各种异常情况

<cstdrag>-----用于访问参数数量文化的函数

<cstdarg>-----用于访问参数数量变化的函数

<cstddef>----用于定义实用的类型和宏

<cstdio>-----用于执行输入和输出

<cstdlib>----用于执行同一操作的不同版本

<string>-----用于处理几种不同的字符串类型

<ctime>------用于在几种不同的时间和日期格式间进行转换

<cwchar>----用于处理宽流(wide stream)和字符串

<cwctype>---用于对宽字符(wide character是)分类

<deque>---(STL)用于定义实现双向队列容器的模板类

<exception>---用于定义控制异常处理的几个函数

<fstream>-----用于定义处理外部文件的几个iostream模板类

<functional>-----(STL)用于定义几个模板,该模板将帮助在

<algorithm><numeric>中定义的 模板构造谓词

<iomapip>---- 用于声明一个带有参数的iostreams控制器

<ios>-----用于定义用作大量iostreams类的基类的模板类

<iosfwd>-----用于定义iostreams模板类(在需要定义之前)

<iostream>---用于声明处理标准流的iostreams对象

<istream>---用于定义执行析取操作的模板类

<iterator>----(STL)用于定义帮助定义和管理迭代器的模板

<limits>---用于测试数字类属性

<list>---(STL)用于定义实现list容器的模板类

<locale>----用于定义在iostreams类中控制与特定位置相关的行为的类和模板

<map>------(STL)用于定义实现关联容器的模板类

<memoery>-----(STL)用于定义对不同容器分配和释放内存的模板

<numeric>-----(STL)用于定义实现实用数字函数的模板

<ostream>----用于定义管理字符串容器的iostreamas模板类

<queque>----(STL)用于实现队列容器的模板类

<set>-----(STL)用于定义实现只有唯一元素的关联容器的模板类

<sstream>----用于定义管理字符串容器的iostreams模板类

<stack>-----(STL)用于定义实现堆栈容器的模板类

<stdexcept>----用于定义提交异常的类

<streambuf>----用于定义为iostreams操作分配缓冲区的模板类

<string>------用于定义是实现字符串容器的模板类

<strstream>-----用于定义处理非内存(in-memory)字符系列的iostreams类

<utility>-----(STL)用于定义通用工具的模板

<valarray>----用于定义支持值(value-oriented)数组的类和模板类

<vector>----(STL)用于定义实现向量容器的模板类

标准c++库还包括18个标准C库中的头文件,但其中有些变化。我们暂时不讨论,这些头文件为:====================

<assert.h>---用于在程序运行时执行断言

<ctype.h>----用于对字符分类

<errno.h>----用于测试用库函数提交的错误代码

<float.h>----用于测试浮点类型属性

<ios646.h>-----用于在IOS646变体字符集中编程

<limits.h>-----用于测试整数类型属性

<locale.h>-----用于适应不同的文化习俗

<math.h>----用于计算常见的数学函数

<setjmp.h>----用于执行非局部的goto语句

<signal.h>----用于控制各种异常情况

<stdrag.h>-----用于访问参数数量变化的函数

<stddef.h>-----用于定义类型和宏

<stdio.h>------用于执行输入和输出

<stdlib.h>------用于执行各种操作

<string.h>-----用于处理字符串

<time.h>-------用于在不同的时间和日期格式之间转换

<wchar.h>-----用于处理宽流(wide stream)和字符类

<wctype.h>-----用于对宽字符(wide character)分类