C++标准库与STL简介

来源:互联网 发布:stm32仿真软件 编辑:程序博客网 时间:2024/05/20 11:47

百度百科云:C++标准库,C++ Standard Library,是类库和函数的集合,其使用核心语言写成,由C++标准委员会制定,并不断维护更新。

就是官方的大牛提前编译封装好的一些函数和数据结构等,在使用C++编程的时候直接调用即可。比如想实现比较两个字符串的大小,自己一行行的写代码不难实现,但标准库中提供了strcmp函数,包含相关头文件之后,直接调用即可实现。

要分清两个概念:标准库和标准模板库,两者的关系如下图所示。
这里写图片描述
C++标准库,即C++ Standard Library,是类库和函数的集合,其使用核心语言写成,由c++标准委员会制定,并不断维护更新。其中包括基本的<iostrream>等。
C++标准模板库,即Standard Template Library(STL),他是c++标准库的一个子集,是一个具有工业强度的,高效的C++程序库。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。

所以在说C++的标准库的时候,是包括STL在内的。

STL三个主要的概念:algorithm(算法)、Container(容器)、iterator(迭代器)和Adaptor(适配器)。几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。从代码的实现方式上可以看出,STL倾向于面向对象的思想,在纯C的环境下会出现兼容性不好的问题。

在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>

1、容器 — Container

是一种数据结构,如list,vector,和deques ,以模板类的方法提供。容器的概念可以结合数组来理解,两者的不同之处是数组中只能存放同一数据类型的基本类型,而容器能放置其他组件,可以是不同类型,容器在元素类型和存储空间大小上比数组要灵活的多。容器分为序列式容器和关联式容器

序列式容器:元素位置固定,取决于插入的时间

Vector:即向量,将元素置于一个动态数组中加以管理,可以随机存取元素(用索引直接存取),能够动态分配内存,数组尾部添加或移除元素非常快速,但是在中部或头部安插元素比较费时;
Deque:即双端队列,是一种支持向两端高效地插入数据、支持随机访问的容器。双端队列的数据被表示为一个分段数组,容器中的元素分段存放在一个个大小固定的数组中,此外容器还需要维护一个存放这些数组首地址的索引数组
List:双向链表,不提供随机存取(按顺序走到需存取的元素,O(n)),在任何位置上执行插入或删除动作都非常迅速,内部只需调整一下指针。

关联式容器:元素位置取决于特定的排序准则,和插入顺序无关

Sets/Multisets:即集合,实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值;另外,还得保证根节点左子树的高度与右子树高度相等。
Maps/Multimaps:即映射,Map的元素是成对的键值/实值,内部的元素依据其值自动排序,Map内的相同数值的元素只能出现一次,Multimaps内可包含多个数值相同的元素,内部由二叉树实现(实际上基于红黑树(RB-tree)实现),便于查找。
Hash:即哈希表,与map和set结合使用(hash_map,hash_set等)。哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。

2、算法(algorithm)

STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成。要使用 STL中的算法函数必须包含头文件<algorithm>,对于数值算法须包含这里写代码片<numeric>,<functional>中则定义了一些模板类,用来声明函数对象。

STL中算法大致分为四类:
1)、非可变序列算法:指不直接修改其所操作的容器内容的算法。
2)、可变序列算法:指可以修改它们所操作的容器内容的算法。
3)、排序算法:包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。
4)、数值算法:对容器内容进行数值计算。

3、迭代器(iterator)

运用于聚合对象的一种模式,通过运用该模式,使得我们可以在不知道对象内部表示的情况下,按照一定顺序(由iterator提供的方法)访问聚合对象中的各个元素。主要由头文件<utility>,<iterator>,<memory>组成。

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

4.适配器(Adaptor)

主要有三种:容器适配器,迭代器适配器,函数适配器

容器适配器:因为这些容器都是基于其他标准容器实现的所以叫做容器的适配器,具体的有stack,queue,priority_queue,默认的情况下,stack和queue基于deque而实现的,,priority_queue在vector上实现的,可以根据第二个实参指定容器的类型,但一定要符合标准,queue要求要有push_front操作因此不能建立在vector上面,priority_front要求有随机访问的功能,因此建立在vector上面。注意:适配器没有提供迭代器,也不能同时插入或删除多个元素。

迭代适配器:插入器是一种迭代器适配器,带有一个容器参数,并生成一个迭代器,提供了三种插入器back_inserter(容器),front_inserter(容器),inserter(容器位置)

函数适配器:用于扩展一元和二元函数对象,如functor 函数对像等等。用于容器与算法之间的操作时使用。

0 0