C++ 标准模板库(Standard Template Library)是C++模板类和函数的集合。
有点像更加具体的“数据结构”
核心包括以下三个组件:
容器(Containers):容器是用来管理某一类对象的集合。
标准容器:
vector:动态连续空间,除了可以在尾部进行扩展,还能进行插入删除。对于迭代器来说,相当于指针,是随机访问迭代器。vector中也包含了一些方法,其中插入/删除方法比较低效,原因在于vector使用连续空间。只有在末尾比较高效。
deque(双向队列):是由一系列固定大小的连续缓冲区(或称为“块”)组成的,这些缓冲区通过指针连接在一起。是一种双向开口的连续线性空间,在两端插入删除效率较高,在中间插入也很低效,也提供了随机访问迭代器,但效率不高。
中控器:用于记录每个缓冲区的位置和大小,以及当前deque的起始和结束位置。
![](https://i-blog.csdnimg.cn/direct/dbcfd6d4a2f34d4f9c864a6174f23eca.png)
list(双向链表):是一种物理存储单元上非连续非顺序的储存结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。list对于任何位置插入或删除元素都是常数项时间,提供双向迭代器。
set/multiset(集合):所有的容器都会根据元素自身的键值进行自动被排序,set的元素既是实值又是键值。set和multiset的底层实现是红黑树。set
的迭代器是双向迭代器,由于set
中的元素是自动排序的,因此迭代器遍历的顺序就是元素的排序顺序。set中的迭代器无法改变set的值,但可以增删查,multiset特性及用法和set完全相同,唯一的差别在于它允许键值重复。
unordered_set/unordered_multiset(无序集合):提供了一种基于哈希表的容器,用于存储唯一的元素集合。与 set
不同,unordered_set
不保证元素的排序,但通常提供更快的查找、插入和删除操作。提供单向迭代器,因为unordered_set内部的顺序没有意义。
map / multimap(映射):map和multimap也是以红黑树作为底层实现机制。map中的数据以pair类型存储,pair的第一元素被视为键值,第二元素被视为实值。所有的元素都会根据元素的键值自动排序,对于map中的迭代器也是双向迭代器,和set中类似,但是可以更改键值对应的实值。map不允许有相同的键值,但multimap可以。
unordered_map/unordered_multimap(无序映射):提供了一种基于哈希表的键值对容器。unordered_map
不保证元素的排序,但通常提供更快的查找速度。也提供单向迭代器。
容器适配器:
它并不是直接存储数据的容器,而是对已有容器的一种封装或适配,使其呈现出另一种容器的行为特性。
stack(栈):先进后出,允许新增元素、移除元素、取得栈顶元素,但是除了最顶端外,没有任何其他方法可以存取stack的其他元素。不存在迭代器。但具有返回栈大小的方法。
queue(队列):先进先出,同样不允许遍历,不支持随机查找,也不存在迭代器,但具有判空和返回队列大小的方法。
priority_queue(优先队列):它允许我们快速访问队列中具有最高(或最低)优先级的元素。它不提供迭代器,也不支持随机访问。priority_queue
默认是一个最大堆(这里指堆的行为,其内部存储结构并不是堆),它依赖于底层容器(如 vector
或 deque
)来存储元素,并通过这些元素的索引来模拟堆的父子关系。
其他常见:array也是一个类模板,内存连续,大小固定,支持索引访问但属于标准库,不属于STL
string属于STL,用来存储字符串,提供了许多字符串处理方法。
算法(Algorithms):算法作用于容器。
具体的算法就到实践中去探索吧!
迭代器(iterators):
迭代器可被视为一种智能指针,包括输入迭代器(Input Iterator)、输出迭代器(Output Iterator)、前向迭代器(Forward Iterator)、双向迭代器(Bidirectional Iterator)和随机访问迭代器(Random Access Iterator)。