栈
// 模板:stack<T,Container=deque<T>>,底层容器为deque,也可以是list或vector,只要是包含empty()、size()、back()、push_back()、pop_back()。
// 创建栈,须包含
#include <stack>
using namespace std;
// 声明
std::stack<int> values; // 默认deque
std::stack<int, std::list<int>> values; // 改为list容器,必须声明类型
// 初始化
std::list<int> values{ 1, 2, 3 };
std::stack<int, std::list<int>> my_stack1(values);
std::stack<int, std::list<int>> my_stack=my_stack1; // 拷贝初始化
std::stack<int, std::list<int>> my_stack(my_stack1);
成员函数 | 功能 |
---|
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 适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。 |
队列
// 模板:queue<T,Container=deque<T>>,底层容器为deque,也可以是list,只要是包含 front()、back()、push_back()、pop_front()、empty()和size() 。
// 创建队列,须包含
#include <queue>
using namespace std;
// 声明
std::queue<int> values; // 默认deque
std::queue<int, std::list<int>> values; // 改为list容器,必须声明类型
// 初始化
std::deque<int> values{1,2,3};
std::queue<int> my_queue1(values);
std::queue<int> my_queue(my_queue1);//或者使用std::queue<int> my_queue = my_queue1;
成员函数 | 功能 |
---|
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 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。 |
优先级队列
// 默认底层容器是vector
// 作为 priority_queue 容器适配器的底层容器,其必须包含 empty()、size()、front()、push_back()、
// pop_back() 这几个成员函数,STL 序列式容器中只有 vector 和 deque 容器符合条件。
// 默认从大到小排列规则
template <typename T,
typename Container=std::vector<T>,
typename Compare=std::less<T> >
// std::less<T> 和 std::greater<T> 都是以函数对象的方式定义在 <function> 头文件中
// 创建优先级队列,须包含
#include <queue>
using namespace std;
// 声明
std::priority_queue<int> values;
// 初始化
//使用普通数组,用来初始化的数组或容器中的数据不需要有序
int values[]{4,1,3,2};
std::priority_queue<int>copy_values(values,values+4);//{4,2,3,1} // 只确定对首元素最大
//使用序列式容器
std::array<int,4>values{ 4,1,3,2 };
std::priority_queue<int>copy_values(values.begin(),values.end());//{4,2,3,1}
// 修改排列规则
int values[]{ 4,1,2,3 };
std::priority_queue<int, std::deque<int>, std::greater<int> >copy_values(values, values+4);//{1,3,2,4} // 小元素在头
成员函数 | 功能 |
---|
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& other) | 将两个 priority_queue 容器适配器中的元素进行互换,需要注意的是,进行互换的 2 个 priority_queue 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。 |