适配器:使一种事物的行为类似于另外一种事物行为的一种机制
容器适配器:没有自己的数据结构,底层调用其它容器的数据结构,对容器进行包装,使其表现出另外一种行为
标准库提供了三种顺序容器适配器:stack(栈 :先进后出) queue(队列 :先进先出) priority_queue(优先级队列 :按照优先级(“<”号)排序) ,不支持迭代器
使用容器适配器需要的头文件有:
#include <stack> //stack
#include<queue> //queue、priority_queue
默认情况下,栈和队列都是基于deque实现的,而优先级队列则是基于vector实现的。
栈stack的特点是先进后出,所以它可用任意一种顺序容器。
队列queue的特点是先进先出,必须提供pop_front操作,因此不能建立在vector容器上;优先级队列priority_queue,要支持随机访问,所以可建在vector或者deque上,不能建立在list上。
种类 | 特点 | 默认顺序容器 | 可用顺序容器 | 不可用顺序容器 |
stack | 先进后出,可用任意一种顺序容器 | deque | vector、list、deque | 无 |
queue | 先进先出,必须提供pop_front操作 | deque | list、deque | vector |
priority_queue | 要支持随机访问 | vector | vector、deque | list |
stack 提供的操作:
* top():返回一个栈顶元素的引用,类型为 T&。如果栈为空,返回值未定义。
* push(const T& obj):可以将对象副本压入栈顶。这是通过调用底层容器的 push_back() 函数完成的。
* push(T&& obj):以移动对象的方式将对象压入栈顶。这是通过调用底层容器的有右值引用参数的 push_back() 函数完成的。
* pop():弹出栈顶元素。
* size():返回栈中元素的个数。
* empty():在栈中没有元素的情况下返回 true。
* emplace():用传入的参数调用构造函数,在栈顶生成对象。
* swap(stack<T> & other_stack):将当前栈中的元素和参数中的元素交换。参数所包含元素的类型必须和当前栈的相同。对于 stack 对象有一个特例化的全局函数 swap() 可以使用。
queue 提供的操作
* front():返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
* back():返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
* push(const T& obj):在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。
* push(T&& obj):以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。
* pop():删除 queue 中的第一个元素。
* size():返回 queue 中元素的个数。
* empty():如果 queue 中没有元素的话,返回 true。
* emplace():用传给 emplace() 的参数调用 T 的构造函数,在 queue 的尾部生成对象。
* swap(queue<T> &other_q):将当前 queue 中的元素和参数 queue 中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap() 来完成同样的操作。
priority_queue 提供的操作
* push(const T& obj):将obj的副本放到容器的适当位置,这通常会包含一个排序操作。
* push(T&& obj):将obj放到容器的适当位置,这通常会包含一个排序操作。
* emplace(T constructor a rgs...):通过调用传入参数的构造函数,在序列的适当位置构造一个T对象。为了维持优先顺序,通常需要一个排序操作。
* top():返回优先级队列中第一个元素的引用。
* pop():移除第一个元素。
* size():返回队列中元素的个数。
* empty():如果队列为空的话,返回true。
* swap(priority_queue<T>& other):和参数的元素进行交换,所包含对象的类型必须相同。
********************************************* 容器的总结 ********************************************
标准库容器类 | 说明 |
顺序容器 |
|
vector(参量) | 1.扩容按倍数增长,导致空间浪费:假设刚开始 2 个空间,使用1个,另一个浪费;pop也浪费空间 2.可以从后面快速插入、删除为O(1),从前头插入或删除为O(n) 3.直接访问任何元素 |
list(双向循环链表) | 1.链表里面使用多少个申请多少个,不会浪费空间 2.头插、尾插、头删、尾删为O(1) 3.从任意地方快速插入与删除 4.双链表需遍历每次节点,访问速度较慢。 |
deque(双端队列) | 支持在两端快速插入和删除,直接访问任何元素 |
关联容器 |
|
set(集合) | 快速查找,不允许重复值 |
multiset(多重集合) | 快速查找,允许重复值 |
map(映射) | 一对一映射,基于关键字快速查找,不允许重复值 |
multimap(多重映射) | 一对多映射,基于关键字快速查找,允许重复值 |
容器适配器 |
|
stack(栈) | 后进先出(LIFO) |
queue(队列) | 先进后出(FIFO) |
priority_queue(优先级队列) | 最高优先级元素总是第一个出列 |