C++标准库和标准模板库
C++强大的功能来源于其丰富的类库及库函数资源。C++标准库的内容总共在50个标准头文件中定义。
在C++开发中,要尽量地利用标准库完成。这样做的直接好处包括:
(1)本钱:已作为标准提供,何必再花费时间、人力重新开发呢;
(2)质量:标准库的都是经过严格测试的,正确性有保证;
(3)效力:关于人的效力已体现在本钱中了,关于代码的履行效力要相信实现标准库的大牛们的水平;
(4)良好的编程风格:采取行业中普遍的做法进行开发。
1、C++标准库
C++标准库的内容分为10类,
分别是:C1.语言支持;C2.输入/输出;C3.诊断;C4.一般工具;C5.字符串;C6.容器;C7.迭代器支持;C8.算法;C9.数值操作;C10.本地化。
C1.标准库中与语言支持功能相干的头文件(11个)
头文件
描写
cstddef
定义宏NULL和offsetof,和其他标准类型size_t和ptrdiff_t。与对应的标准C头文件的区分是,NULL是C++空指针常量的补充定义,宏offsetof接受结构或联合类型参数,只要他们没有成员指针类型的非静态成员便可。
limits
提供与基本数据类型相干的定义。例如,对每一个数值数据类型,它定义了可以表示出来的最大值和最小值和二进制数字的位数。
climits
提供与基本整数数据类型相干的C样式定义。这些信息的C++样式定义在limits中
cfloat
提供与基本浮点型数据类型相干的C样式定义。这些信息的C++样式定义在limits中
cstdlib
提供支持程序启动和终止的宏和函数。这个头文件还声明了许多其他杂项函数,例如搜索和排序函数,从字符串转换为数值等函数。它与对应的标准C头文件stdlib.h不同,定义了abort(void)。abort()函数还有额外的功能,它不为静态或自动对象调用析构函数,也不调用传给atexit()函数的函数。它还定义了exit()函数的额外功能,可以释放静态对象,以注册的逆序调用用atexit()注册的函数。清除并关闭所有打开的C流,把控制权返回给主机环境。
new
支持动态内存分配
typeinfo
支持变量在运行期间的类型标识
exception
支持异常处理,这是处理程序中可能发生的毛病的一种方式
cstdarg
支持接受数量可变的参数的函数。即在调用函数时,可以给函数传送数量不等的数据项。它定义了宏va_arg、va_end、va_start和va_list类型
csetjmp
为C样式的非本地跳跃提供函数。这些函数在C++中不经常使用
csignal
为中断处理提供C样式支持
C2.支持流输入/输出的头文件(11个)
头文件
描写
iostream
支持标准流cin、cout、cerr和clog的输入和输出,它还支持多字节字符标准流wcin、wcout、wcerr和wclog。
iomanip
提供操纵程序,允许改变流的状态,从而改变输出的格式。
ios
定义iostream的基类
istream
为管理输出流缓存区的输入定义模板类
ostream
为管理输出流缓存区的输出定义模板类
sstream
支持字符串的流输入输出
fstream
支持文件的流输入输出
iosfwd
为输入输出对象提供向前的声明
streambuf
支持流输入和输出的缓存
cstdio
为标准流提供C样式的输入和输出
cwchar
支持多字节字符的C样式输入输出
C3.与诊断功能相干的头文件(3个)
头文件
描写
stdexcept
定义标准异常。异常是处理毛病的方式
cassert
定义断言宏,用于检查运行期间的情形
cerrno
支持C样式的错误信息
C4.定义工具函数的头文件(4个)
头文件
描写
utility
定义重载的关系运算符,简化关系运算符的写入,它还定义了pair类型,该类型是一种模板类型,可以存储一对值。这些功能在库的其他地方使用
functional
定义了许多函数对象类型和支持函数对象的功能,函数对象是支持operator()()函数调用运算符的任意对象
memory
给容器、管理内存的函数和auto_ptr模板类定义标准内存分配器
ctime
支持系统时钟函数
C5.支持字符串处理的头文件(6个)
头文件
描写
string
为字符串类型提供支持和定义,包括单字节字符串(由char组成)的string和多字节字符串(由wchar_t组成)
cctype
单字节字符种别
cwctype
多字节字符种别
cstring
为处理非空字节序列和内存块提供函数。这不同于对应的标准C库头文件,几个C样式字符串的一般C库函数被返回值为const和非const的函数对替换了
cwchar
为处理、履行I/O和转换多字节字符序列提供函数,这不同于对应的标准C库头文件,几个多字节C样式字符串操作的一般C库函数被返回值为const和非const的函数对替换了。
cstdlib
为把单字节字符串转换为数值、在多字节字符和多字节字符串之间转换提供函数
C6.定义容器类的模板的头文件(8个)
头文件
描写
vector
定义vector序列模板,这是一个大小可以重新设置的数组类型,比普通数组更安全、更灵活
list
定义list序列模板,这是一个序列的链表,常常在任意位置插入和删除元素
deque
定义deque序列模板,支持在开始和结尾的高效插入和删除操作
queue
为队列(先进先出)数据结构定义序列适配器queue和priority_queue
stack
为堆栈(落后先出)数据结构定义序列适配器stack
map
map是一个关联容器类型,允许根据键值是唯一的,且依照升序存储。multimap类似于map,但键不是唯一的。
set
set是一个关联容器类型,用于以升序方式存储唯一值。multiset类似于set,但是值没必要是唯一的。
bitset
为固定长度的位序列定义bitset模板,它可以看做固定长度的紧凑型bool数组
C7.支持迭代器的头文件(1个)
头文件
描写
iterator
给迭代器提供定义和支持
C8.有关算法的头文件(3个)
头文件
描写
algorithm
提供一组基于算法的函数,包括置换、排序、合并和搜索
cstdlib
声明C标准库函数bsearch()和qsort(),进行搜索和排序
ciso
允许在代码中使用and代替
C9.有关数值操作的头文件(5个)
头文件
描写
plex
支持复杂数值的定义和操作
valarray
支持数值矢量的操作
numeric
在数值序列上定义一组一般数学操作,例如accumulate和inner_product
cmath
这是C数学库,其中还附加了重载函数,以支持C++约定
cstdlib
提供的函数可以提取整数的绝对值,对整数进行取余数操作
C10.有关本地化的头文件(2个)
头文件
描写
locale
提供的本地化包括字符种别、排序序列和货币和日期表示。
clocale
对本地化提供C样式支持
C++标准库的所有头文件都没有扩展名。C++标准库以cname情势的标准头文件提供。
在cname情势标准的头文件中,与宏相干的名称在全局作用域中定义,其他名称在std命名空间中声明。
在C++中还可以使用name.h情势的标准C库头文件名。在这10类头文件中,cstdlib头文件分别在C5/C8/C9中出现了。
2、标准模板库STL简介
STL(StandardTemplateLibrary,标准模板库)是惠普实验室开发的一系列软件的统称。现然主要出现在C++中,但在被引入C++之前该技术就已存在了很长的一段时间。
STL的代码从广义上讲分为3类:algorithm(算法)、container(容器)和iterator(迭代器),几近所有的代码都采取了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来讲提供了更好的代码重用机会。
在C++标准中,STL被组织为下面的13个头文件:
algorithm、deque、functional、iterator、vector、list、map、memory、numeric、queue、set、stack和utility。
1、算法
函数库对数据类型的选择和对其可重用性起着至关重要的作用。举例来说,一个求方根的函数,在使用浮点数作为其参数类型的情况下的可重用性肯定比使用整型作为它的参数类性要高。
而C++通过模板的机制允许推延对某些类型的选择,直到真正想使用模板或说对模板进行特化的时候,STL就利用了这一点提供了相当多的有用算法。
它是在一个有效的框架中完成这些算法的,可以将所有的类型划分为少数的几类,然后就可以在模版的参数中使用一种类型替换掉同一种类中的其他类型。
STL提供了大约个实现算法的模版函数,比如算法for_each将为指定序列中的每个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。
这样一来,只要熟习了STL以后,许多代码可以被大大的简化,只需要通过调用1两个算法模板,就可以完成所需要的功能并大大地提升效力。
算法部份主要由头文件algorithm,numeric和functional组成。algorithm是所有STL头文件中最大的一个(虽然它很好理解),
它是由一大堆模版函数组成的,可以认为每一个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。
numeric体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。functional中则定义了一些模板类,用以声明函数对象。
2、容器
在实际的开发进程中,数据结构本身的重要性不会逊于操作于数据结构的算法的重要性,当程序中存在着对时间要求很高的部份时,数据结构的选择就显得更加重要。
经典的数据结构数量有限,但是我们常常重复着一些为了实现向量、链表等结构而编写的代码,这些代码都十分相似,只是为了适应不同数据的变化而在细节上有所出入。
STL容器就为我们提供了这样的方便,它允许我们重复利用已有的实现构造自己的特定类型下的数据结构,通过设置一些模版类,
STL容器对最经常使用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类型,可以将我们许多重复而乏味的工作简化。
容器部份主要由头文件vector,list,deque,set,map,stack和queue组成。对经常使用的一些容器和容器适配器(可以看做由其它容器实现的容器),
可以通过下表总结一下它们和相应头文件的对应关系。
数据结构
描写
实现头文件
向量(vector)
连续存储的元素
vector
列表(list)
由节点组成的双向链表,每一个结点包括着一个元素
list
双队列(deque)
连续存储的指向不同元素的指针所组成的数组
deque
集合(set)
由节点组成的红黑树,每一个节点都包括着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够具有相同的次序
set
多重集合(multiset)
允许存在两个次序相等的元素的集合
set
栈(stack)
落后先出的值的排列
stack
队列(queue)
先进先出的执的排列
queue
优先队列(priority_queue)
元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列
queue
映照(map)
由{键,值}对组成的集合,以某种作用于键对上的谓词排列
map
多重映照(multimap)
允许键对有相等的次序的映照
map
3、迭代器
迭代器从作用上来说是最基本的部份,可是理解起来比前二者都要费力一些。软件设计有一个基本原则,所有的问题都可以通过引进一个间接层来简化,这类简化在STL中就是用迭代器来完成的。
概括来讲,迭代器在STL中用来将算法和容器联系起来,起着一种黏和剂的作用。
几近STL提供的所有算法都是通过迭代器存取元素序列进行工作的,每个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。
迭代器部份主要由头文件utility,iterator和memory组成。utility是一个很小的头文件,它包括了贯穿使用在STL中的几个模板的声明,
iterator中提供了迭代器使用的许多方法,而对memory的描写则十分的困难,它以不同寻常的方式为容器中的元素分配存储空间,
同时也为某些算法履行期间产生的临时对象提供机制,memory中的主要部份是模板类allocator,它负责产生所有容器中的默许分配器。
3、C++标准库与STL的关系
STL是最新的C++标准函数库中的一个子集,这个庞大的子集占据了全部库的大约80%的份量。而作为在实现STL进程中扮演关键角色的模板则充斥了几近全部C++标准函数库。
C++标准函数库为C++程序员们提供了一个可扩大的基础性框架。我们从中可以获得极大的便利,同时也可以通过继承现有类,自己编制符合接口规范的容器、算法、迭代子等方式对之进行扩大。
C++标准库是std名字空间中的所有内容,就是那些不带.h的头文件,如cstdio、iostream等。如std::string,及IO流都不属于STL,
但它们是STL兼容的,可以运用迭代器,算法等。虽然std::string和IO流也是模板类,但其实不属于STL。
凌阳教育是原厂嵌入式培训中心
长按
白癜风最好的医院白癜风治疗方法