通过封装某个序列容器,根据实际的应用场景对成员函数进行组合调用,以满足特定的需求。
表2.1 STL容器适配器
容器适配器 | 基础容器需要包含的成员函数 | 可使用的基础容器 |
---|---|---|
stack (栈适配器 后进先出) |
| deque(默认) vector list |
queue (队列适配器 先进先出) |
| deque(默认) list |
priority_queue (最大元素在队列最前) |
| vector(默认) deque |
栈,数据的存取只能够从栈顶处进行操作。
stack<T,Container=deque<T>> // T:存储元素的类型;Conainer:底层容器类型。
示例:
#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.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 适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。 |
先进先出
queue<T,Container=deque<T>>
操作同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<T> &other_queue) | 将两个 queue 容器适配器中的元素进行互换,需要注意的是,进行互换的 2 个 queue 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。 |
优先级最大的元素先出列。(优先级根据排序规则评判)
队头总是优先级最大的元素,但队列并不一定时按优先级进行了排序???
template <typename T,
typename Container=std::vector<T>,
typename Compare=std::less<T> >
class priority_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}
示例:
priority_queue<int, std::deque<int>, std::greater<int> > 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<T>& other) | 将两个 priority_queue 容器适配器中的元素进行互换,需要注意的是,进行互换的 2 个 priority_queue 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。 |
stack只能访问栈顶的元素,queue可以访问队列头和尾部的元素,priority_queue只能访问队头的元素。