0
点赞
收藏
分享

微信扫一扫

【C++如此简单】容器适配器:栈&队列&优先级队列

王远洋 2022-04-14 阅读 63
c++

// 模板: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 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。
举报

相关推荐

0 条评论