STL六大组件

STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。STL中包括六大组件:容器、算法、迭代器、适配器、仿函数、空间配置器
适配器:适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该中模式是将一个类的接口转换成客户希望的另外一个接口。

一、容器

序列式容器(vector、deque、list)、关联式容器(map、set)、容器适配器(stack、queue、priority_queue)

1. vector

是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问。由于具有连续的存储空间,所以在插入和删除操作方面,效率比较慢

2. deque

deque 是 double ended queue 的缩写,双向队列不论在尾部或头部插入元素,都十分迅速。而在中间插入元素则会比较费时,因为必须移动中间其他的元素。与 vector 不同,deque 不能保证将所有元素存储在连续的存储空间上

3. list

list 是 STL 实现的双向链表,与 vector 相比, 它允许快速的插入和删除,但是随机访问却比较慢

4. map、multimap、unordered_map、unordered_multimap

  • map 是 STL 的一个关联容器,它是一种键值对容器,里面的数据都是成对出现的,且键值是唯一的,可在我们处理一对一数据的时候,在编程上提供快速通道。map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的
  • multimap 中的元素也是有序的,但允许存在相同键值的
  • unordered_map 中的元素是唯一的,但无序(也不是插入顺序),而是根据它们的散列值(hash values)组织成桶(buckets),从而允许通过键值直接快速访问单个元素(速度一般比 map 更快)
  • unordered_multimap 无序且不唯一

5. set、multiset、unordered_set、unordered_multiset

  • set 的含义是集合,它是一个有序的容器,里面的元素都是唯一且排序好的,支持插入、删除、查找等操作,就像一个集合一样,所有的操作都是严格在 logn时间内完成,效率非常高,使用方法类似 list
  • multiset 也是排序好的,但是可以存有相同的元素
  • unordered_set 无序但元素是不可重复的
  • unordered_multiset 无序,元素也不唯一

二、容器适配器

虽然 stack、queue、priority_queue 中也可以存放元素,但在 STL 中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为每个容器在底层都有自己的实现方式,而 stack、queue、priority_queue 只是在底层将其他容器进行了封装

std::stack
template<class T, class Container = deque<T>>
class stack;

std::queue
template<class T, class Container = deque<T>>
class queue;

std::priority_queue
template<class T, class Container = vector<T>, class Compare = less<typename Container::value_type>>
class priority_queue;

为什么选择 deque 作为 stack 和 queue 的底层默认容器?

stack 是后进先出的特殊线性数据结构,只要具有 push_back() 和 pop_back() 操作的线性结构,都可以作为 stack 的底层容器,比如 vector 和 list 都可以;
queue 是先进先出的特殊线性数据结构,只要具有 push_back() 和 pop_front() 操作的线性结构,都可以作为 queue 的底层容器,比如 list。

但是 STL 中对 stack 和 queue 默认选择 deque 作为其底层容器,主要是因为:

  • stack 和 queue 不需要遍历(因此 stack 和 queue 没有迭代器),只需要在固定的一端或者两端进行操作。
  • 在 stack 中元素增长时,deque 比 vector 的效率高。
  • 在 queue 中的元素增长时,deque 不仅效率高,而且内存使用率高

三、算法

  1. 十大经典算法