C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。
C++ 标准模板库的核心包括以下三个组件:
| 组件 | 描述 |
|---|---|
| 容器(Containers) | 容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。 |
| 算法(Algorithms) | 算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。 |
| 迭代器(iterators) | 迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。 |
| 函数对象 | 如果一个类将 () 运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象(又称仿函数)。 |
| 适配器 | 可以使一个类的接口(模板的参数)适配成用户指定的形式,从而让原本不能在一起工作的两个类工作在一起。值得一提的是,容器、迭代器和函数都有适配器。 |
| 内存分配器 | 为容器类模板提供自定义的内存申请和释放功能,由于往往只有高级用户才有改变内存分配策略的需求,因此内存分配器对于一般用户来说,并不常用。 |
C++ STL头文件
,
以 C++ 定义数组的操作为例,在 C++ 中如果定义一个数组,可以采用如下方式:
int a[n];
这种定义数组的方法需要事先确定好数组的长度,即 n 必须为常量,这意味着,如果在实际应用中无法确定数组长度,则一般会将数组长度设为可能的最大值,但这极有可能导致存储空间的浪费。
所以除此之外,还可以采用在堆空间中动态申请内存的方法,此时长度可以是变量:
int *p = new int[n];
这种定义方式可根据变量 n 动态申请内存,不会出现存储空间浪费的问题。但是,如果程序执行过程中出现空间不足的情况时,则需要加大存储空间,此时需要进行如下操作:
- 新申请一个较大的内存空间,即执行int * temp = new int[m];
- 将原内存空间的数据全部复制到新申请的内存空间中,即执行memecpy(temp, p, sizeof(int)*n);
- 将原来的堆空间释放,即执行delete [] p; p = temp;
而完成相同的操作,如果采用 STL 标准库,则会简单很多,因为大多数操作细节将不需要程序员关心。下面是使用向量模板类 vector 实现以上功能的示例:
vectora; //定义 a 数组,当前数组长度为 0,但和普通数组不同的是,此数组 a 可以根据存储数据的数量自动变长。 //向数组 a 中添加 10 个元素 for (int i = 0; i < 10 ; i++) a.push_back(i) //还可以手动调整数组 a 的大小 a.resize(100); a[90] = 100; //还可以直接删除数组 a 中所有的元素,此时 a 的长度变为 0 a.clear(); //重新调整 a 的大小为 20,并存储 20 个 -1 元素。 a.resize(20, -1)
使用 STL 可以更加方便灵活地处理数据。
算法算法(algorithm)是应用在容器上以各种方法处理其内容的行为和功能。例如:有对容器内容排序、复制、检索、合并等算法。在STL中,算法是由模板函数表现的。这些函数不是容器类的成员函数,相反它们是独立的函数。令人吃惊的特点之一就是其算法是如此的通用,不仅可以将其用于STL容器,而且可以用于普通的C++数组或任何其他应用程序指定的容器。
STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。
算法部分主要由头文件,
- :是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模板函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等;
:体积很小,只包括几个在序列上面进行简单数学运算的模版函数,包括加法和乘法在序列上的一些操作; :其中定义了一些模板类,用以声明函数对象。
容器是数据在内存中的组织的方法,例如:数组、堆栈、队列、链表、二叉树等(这些都不是STL标准容器)。STL中的容器是一种存储T(Template)类型值的有限集合的数据结构,容器的内部实现一般是类。这些值可以是对象本身,如果数据类型T代表的是class的化。
容器部分主要由头文件,
- 向量(vector):连续存储的元素
; - 列表(list):由节点组成的双向列表,每个节点包含着一个元素
- ;
- 双队列(deque):连续存储的指向不同元素的指针所组成的数组
; - 集合(set):由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序
; - 多重集合(multiset):允许存在两个次序相等的元素的集合
; - 栈(stack):后进先出的值的排列
; - 队列(queue):先进先出的值的排列
; - 优先队列(priority_queue):元素的次序是由作用于所存储的值对上的某种谓词决定的一种队列
; - 映射(map):由{键,值}对组成的集合,以某种作用于键对上的谓词排列
- 多重映射(multimap):允许键对有相等的次序的映射
STL序列容器
STL关联式容器–map
迭代器在STL中用来将算法和容器联系起来,起着一种黏和剂的作用。几乎STL提供的所有算法都是通过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。
迭代器部分主要由头文件
:是一个很小的头文件,它包括了贯穿使用在STL中的几个模版的声明; :提供了迭代器使用的许多方法 :它以不同寻常的方式为容器中的元素分配存储空间,同时也为某些算法执行期间产生的临时对象提供机制; 中的主要部分是模板类allocator,它负责产生所有容器中的默认分配器。



