1 介绍
通过封装某个序列容器,根据实际的应用场景对成员函数进行组合调用,以满足特定的需求。
2 适配器种类
表2.1 STL容器适配器
容器适配器 | 基础容器需要包含的成员函数 | 可使用的基础容器 |
---|---|---|
stack (栈适配器 后进先出) |
|
deque(默认) vector list |
queue (队列适配器 先进先出) |
|
deque(默认) list |
priority_queue (最大元素在队列最前) |
|
vector(默认) deque |
3 stack容器适配器
栈,数据的存取只能够从栈顶处进行操作。
3.1 模板类
stack<T,Container=deque<T>> // T:存储元素的类型;Conainer:底层容器类型。
3.2 创建方式
- stack<dataType> name; // 创建一个底层为deque容器的stack适配器。
- stack<dataType1, containerType<dataType2>> // 创建一个空的stack适配器,自定义底层容器,如果dataType1和dataType2不是同一种数据类型,stack底层将默认使用deque容器。
- 使用基础容器初始化stack适配器。
- 使用另一个适配器初始化适配器。
示例:
#include <iostream>
#include <stack>
#include <list>
#include <vector>
using namespace std;
int main()
{
// 1 创建空的适配器
stack<int> s1;
// 2 修改底层容器并创建空的适配器
stack<string, list<int>> s2;
// 3 使用基础容器初始化适配器
list<int> l1{1, 2, 3};
vector<int> v1{4, 5, 6};
stack<int, list<int>> s3;
stack<int, vector<int>> s4;
// 4 使用其他stack初始化适配器
// 方式1
stack<int, list<int>> s5 = s3;
// 方式2
stack<int, vector<int>> s6 = s4;
return 0;
}
3.3 成员方法
表 3.1 stack适配器支持的成员方法
成员函数 | 功能 |
---|---|
empty() | 当 stack 栈中没有元素时,该成员函数返回 true;反之,返回 false。 |
size() | 返回 stack 栈中存储元素的个数。 |
top() | 返回一个栈顶元素的引用,类型为 T&。如果栈为空,程序会报错。 |
push(const T& val) | 先复制 val,再将 val 副本压入栈顶。这是通过调用底层容器的 push_back() 函数完成的。 |
push(T&& val) | 以移动元素的方式将其压入栈顶。这是通过调用底层容器的有右值引用参数的 push_back() 函数完成的。 |
pop() | 弹出栈顶元素。 |
emplace(arg...) | arg... 可以是一个参数,也可以是多个参数,但它们都只用于构造一个对象,并在栈顶直接生成该对象,作为新的栈顶元素。 |
swap(stack<T> & other_stack) | 将两个 stack 适配器中的元素进行互换,需要注意的是,进行互换的 2 个 stack 适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。 |
4 queue容器
4.1 介绍
先进先出
模板类:
queue<T,Container=deque<T>>
4.2 创建方式
- queue<dataType> name; // 创建一个底层为deque容器的queue适配器。
- queue<dataType1, containerType<dataType2>> // 创建一个空的queue适配器,自定义底层容器。
- 使用基础容器初始化queue适配器。
- 使用另一个适配器初始化适配器。
操作同stack适配器相同。且底层容器可选择deque(默认)、list
4.3 成员方法
表4.1 deque的成员方法
成员函数 | 功能 |
---|---|
empty() | 如果 queue 中没有元素的话,返回 true,否则返回false。 |
size() | 返回 queue 中元素的个数。 |
front() | 返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。 |
back() | 返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。 |
push(const T& obj) | 在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。 |
push(T&& obj) | 以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。 |
emplace() | 在 queue 的尾部直接添加一个元素。 |
pop() | 删除 queue 中的第一个元素。 |
swap(queue<T> &other_queue) | 将两个 queue 容器适配器中的元素进行互换,需要注意的是,进行互换的 2 个 queue 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。 |
5 priority_queue
5.1 介绍
优先级最大的元素先出列。(优先级根据排序规则评判)
队头总是优先级最大的元素,但队列并不一定时按优先级进行了排序???
模板类:
template <typename T,
typename Container=std::vector<T>,
typename Compare=std::less<T> >
class priority_queue{
//......
}
5.2 创建方式
- priority_queue<int> name; // 创建一个空的priority_queue 适配器。
- 使用基础容器或者数组初始化queue适配器。
示例:
//方式1 使用普通数组
int a1[]{1,2,3,4};
std::priority_queue<int> q1(a1, a1+4);//{1,2,3,4}
//方式2 使用序列式容器
std::array<int,3>values{1,2,3};
std::priority_queue<int>q1(values.begin(),values.end());//{1,2,3}
5.3 排序规则(优先级判别)
- std::less<T> // 从大到小(默认)
- std::greater<T> // 从小到大
- 自定义
示例:
priority_queue<int, std::deque<int>, std::greater<int> > q1; // 从大到小
5.4 成员方法
表5.1 priority_queue的成员方法
成员函数 | 功能 |
---|---|
empty() | 如果 priority_queue 为空的话,返回 true;反之,返回 false。 |
size() | 返回 priority_queue 中存储元素的个数。 |
top() | 返回 priority_queue 中第一个元素的引用形式。 |
push(const T& obj) | 根据既定的排序规则,将元素 obj 的副本存储到 priority_queue 中适当的位置。 |
push(T&& obj) | 根据既定的排序规则,将元素 obj 移动存储到 priority_queue 中适当的位置。 |
emplace(Args&&... args) | Args&&... args 表示构造一个存储类型的元素所需要的数据(对于类对象来说,可能需要多个数据构造出一个对象)。此函数的功能是根据既定的排序规则,在容器适配器适当的位置直接生成该新元素。 |
pop() | 移除 priority_queue 容器适配器中第一个元素。 |
swap(priority_queue<T>& other) | 将两个 priority_queue 容器适配器中的元素进行互换,需要注意的是,进行互换的 2 个 priority_queue 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。 |
stack只能访问栈顶的元素,queue可以访问队列头和尾部的元素,priority_queue只能访问队头的元素。