通过封装某个序列容器,根据实际的应用场景对成员函数进行组合调用,以满足特定的需求。
表2.1 STL容器适配器
容器适配器 | 基础容器需要包含的成员函数 | 可使用的基础容器 |
---|---|---|
stack (栈适配器 后进先出) |
|
deque(默认) vector list |
queue (队列适配器 先进先出) |
|
deque(默认) list |
priority_queue (最大元素在队列最前) |
|
vector(默认) deque |
栈,数据的存取只能够从栈顶处进行操作。
stack
> // T:存储元素的类型;Conainer:底层容器类型。
示例:
#include
#include
#include
#include
using namespace std;
int main()
{
// 1 创建空的适配器
stack s1;
// 2 修改底层容器并创建空的适配器
stack> s2;
// 3 使用基础容器初始化适配器
list l1{1, 2, 3};
vector v1{4, 5, 6};
stack> s3;
stack> s4;
// 4 使用其他stack初始化适配器
// 方式1
stack> s5 = s3;
// 方式2
stack> s6 = s4;
return 0;
}
表 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 |
将两个 stack 适配器中的元素进行互换,需要注意的是,进行互换的 2 个 stack 适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。 |
先进先出
queue
>
操作同stack适配器相同。且底层容器可选择deque(默认)、list
表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 |
将两个 queue 容器适配器中的元素进行互换,需要注意的是,进行互换的 2 个 queue 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。 |
优先级最大的元素先出列。(优先级根据排序规则评判)
队头总是优先级最大的元素,但队列并不一定时按优先级进行了排序???
template
typename Container=std::vector
, typename Compare=std::less
> class priority_queue{
//......
}
示例:
//方式1 使用普通数组
int a1[]{1,2,3,4};
std::priority_queue q1(a1, a1+4);//{1,2,3,4}
//方式2 使用序列式容器
std::arrayvalues{1,2,3};
std::priority_queueq1(values.begin(),values.end());//{1,2,3}
示例:
priority_queue, std::greater > q1; // 从大到小
表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 |
将两个 priority_queue 容器适配器中的元素进行互换,需要注意的是,进行互换的 2 个 priority_queue 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。 |
stack只能访问栈顶的元素,queue可以访问队列头和尾部的元素,priority_queue只能访问队头的元素。