文章目录
- 引言
- 栈和队列
- priority_queue
- 仿函数
- 迭代器区间
引言
栈的特性是先进后出,队列的特性是先进先出,然而双向队列同时具有栈和队列的特性,所以我们可以通过双向队列来适配出栈和队列。
先看库里面
栈和队列
stack和queue模板参数里面都有一个class Container = deque,就是说库里面在实现它们时默认是通过deque适配出来的。
比如stack的push底层其实是通过调用deque的push_back()实现的,pop底层是通过调用deque的pop_back()实现的
对于queue的push底层是通过调用deque的push_front()实现的,pop是通过调用deque的1pop_front()实现的
priority_queue
优先队列底层就是堆,使用数组实现的,所以我们可以使用容器vector适配出优先队列
仿函数
此外还有一个参数
class Compare = less
这个参数其实就是一个仿函数,什么是仿函数呢?就是把一个类对象像函数一样使用。怎么实现呢?底层就是把这个类重载了一个()运算符。在传这个参数时,我们可以自己实现一个仿函数去传,也可以使用库里面的
这两个是库里面包含的两个仿函数,用于比较大小,去排序,值得注意的是这里的less指的是升序,而greater是指降序
因此优先队列默认不传第二个参数的情况下,输出结果是升序
//仿函数/函数对象
//重载了括号,让类可以向函数一样被调用
template<class T>
class Less
{
public:
bool operator()(const T& x, const T& y)
{
return x < y;
}
};
template<class T>
class Greater
{
public:
bool operator()(const T& x, const T& y)
{
return x > y;
}
};
库里面
//template <class T> struct less : binary_function <T, T, bool> {
// bool operator() (const T& x, const T& y) const { return x < y; }
//};
//
//template <class T> struct greater : binary_function <T, T, bool> {
// bool operator() (const T& x, const T& y) const { return x > y; }
//};
迭代器区间
容器对象的构造函数还支持迭代器区间初始化,就是通过迭代器去迭代别的对象中存的值来对这个对象进行初始化。
template<class InputInterator>
priority_queue(InputInterator first, InputInterator last)
{
//插入数据
while (first != last)
{
_con.push_back(*first);
++first;
}
//建堆
//从最后一个非叶子节点开始建堆-----关键
for (int i = (_con.size()-1-1) / 2; i >= 0; i--)
{
AdjustDown(i);
}
}