将不适用的序列式容器(vector、deque、list)变得适用。通过封装某个序列式容器,并重新组合该容器中包含的成员函数,使其满足某些特定的场景需要
先进后出

| 成员函数 | 功能 |
|---|---|
| empty() | 当 stack 栈中没有元素时,该成员函数返回 true;反之,返回 false。 |
| size() | 返回 stack 栈中存储元素的个数。 |
| top() | 返回一个栈顶元素的引用,类型为 T&。如果栈为空,程序会报错。 |
| push(const T& val) | 先复制 val,再将 val 副本压入栈顶。这是通过调用底层容器的 push_back() 函数完成的。 |
| push(T&& obj) | 以移动元素的方式将其压入栈顶。这是通过调用底层容器的有右值引用参数的 push_back() 函数完成的。 |
| pop() | 弹出栈顶元素。 |
| emplace(arg…) | arg… 可以是一个参数,也可以是多个参数,但它们都只用于构造一个对象,并在栈顶直接生成该对象,作为新的栈顶元素。 |
| swap(stack & other_stack) | 将两个 stack 适配器中的元素进行互换,需要注意的是,进行互换的 2 个 stack 适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。 |
stack<int> s1; //使用默认deque作为底层基础容器
list<int> li{ 12,24,56,79 };
stack<int, list<int>> s2(li); //使用list作为底层基础容器
//基础容器初始化stack适配器 容器类型与stack底层使用的基础容器类型相同即可
stack<int, list<int>> s3 = s2; //基础容器类型相同即可
先进先出(first in,first out)

作为 queue 容器适配器的基础容器,其必须提供 front()、back()、push_back()、pop_front()、empty() 和 size() 这几个成员函数,符合条件的序列式容器仅有 deque 和 list。
| 成员函数 | 功能 |
|---|---|
| empty() | 如果 queue 中没有元素的话,返回 true。 |
| size() | 返回 queue 中元素的个数。 |
| front() | 返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。 |
| back() | 返回 queue 中**最后一个元素的引用。**如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。 |
| push(const T& obj) | 在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。 |
| emplace() | 在 queue 的尾部直接添加一个元素。 |
| push(T&& obj) | 以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。 |
| pop() | 删除 queue 中的第一个元素。 |
| swap(queue &other_queue) | 将两个 queue 容器适配器中的元素进行互换,需要注意的是,进行互换的 2 个 queue 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。 |
//queue values;
//queue> values; //使用list作为基础容器
std::deque<int> values{ 1,2,3 };
std::queue<int> my_queue1(values); //使用基础容器初始化queue容器
std::queue<int> my_queue(my_queue1); //使用一个适配器初始化另一个适配器
//cout << my_queue.back() << endl;
my_queue.push(5);
for (int i = 0; i < 8; i++)
{
my_queue.push(i + 3);
}
while (!my_queue.empty())
{
cout << my_queue.front() << endl;
//访问过的元素出队列
my_queue.pop();
}
- 容器适配器存储元素只能“从一端进(称为队尾),从另一端出(称为队头)”,且每次只能访问 priority_queue 中位于队头的元素。
- 容器中元素的存取,先进队列的不一定先出,而是优先级最大的元素最先出队列
- 底层采用的是堆结构
| 成员函数 | 功能 |
|---|---|
| empty() | 当 priority_queue中没有元素时,该成员函数返回 true;反之,返回 false。 |
| size() | 返回 priority_queue中存储元素的个数。 |
| top() | 返回一个priority_queue第一个元素的引用,类型为 T&。如果栈为空,程序会报错。 |
| push(const T& val) | 先 ** 复制 val,再将 val 副本压入** priority_queue。 |
| push(T&& obj) | 以移动元素的方式将其压入priority_queue |
| pop() | 弹出priority_queue容器适配器中第一个元素。 |
| emplace(arg…) | arg… 可以是一个参数,也可以是多个参数,但它们都只用于构造一个对象,并在栈顶直接生成该对象,作为新的栈顶元素。 |
| swap(priority_queue< T> & other_stack) | 将两个 priority_queue适配器中的元素进行互换,需要注意的是,进行互换的 2 个 priority_queue适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。 |
template <typename T,
typename Container=std::vector<T>,
typename Compare=std::less<T> >
class priority_queue{
//......
}
//typename T:指定存储元素的具体类型;
//typename Container:指定 priority_queue 底层使用的基础容器,默认使用 vector 容器。deque容器
//typename Compare:指定容器中评定元素优先级所遵循的排序规则,默认使用std::less按照元素值从大到小进行排序,还可以使用std::greater按照元素值从小到大排序,但更多情况下是使用自定义的排序规则。
priority_queue<int> value;
//使用普通数组
int values[]{ 4,1,3,2 };
std::priority_queue<int> copy_values(values, values + 4);//{4,2,3,1}
//使用序列式容器
std::array<int,4> valus1 { 4,1,3,2 };
std::priority_queue<int> copy_values(valus1.begin(), valus1.end());//{4,2,3,1}
//手动指定底层容器
int values1[]{ 4,1,2,3 };
std::priority_queue<int, std::deque<int>, std::greater<int> >copy_values(values1, values1 + 4);//{1,3,2,4}
return 0;
数据有序(自动排序)底层是红黑树(增删改查速度非常快)
不允许重复
允许重复
数据按key有序 底层是红黑树
不允许重复
数据按key有序 底层是红黑树
允许重复