2020-10-27

优先队列

< queue >

template <class T, class Container = vector<T>, class Compare = less<typename Container::value_type> > class priority_queue;

介绍

优先队列是一种容器适配器,它的第一个元素永远是容器中“最大的”元素,所谓“最大”是通过自定义的某个准则(弱排序准则)排出的。
就像堆一样,可以随时插入元素,但是只能获取最大元素(最大堆),就像是优先队列中的第一个元素。
优先队列被实现为容器适配器,它们是使用特定容器类的封装对象作为其底层容器的类,提供了一组特定的成员函数来访问其元素。 从特定容器的“后部”弹出元素,这被称为优先级队列的顶部。
底层容器可以是一种标准模板容器,也可以是专门设计的容器类。它需要可以通过随机访问迭代器来读取元素,并且至少实现以下操作:

empty() size() front() push_back() pop_back()

标准容器类vector和deque满足上述要求,默认使用vector作为底层容器。
支持随机迭代器访问需要在内部一直维持堆结构。这是通过容器适配器在需要时自动的在内部调用make_heap(),pop_heap(),push_heap()来实现的。

模板参数

  • T
    元素类型,别名priority_queue::value_type
  • Container
    底层的容器类型,默认为vector,其元素类型为T,别名priority_queue::container_type
  • Compare
    一个二元谓词,它使用两个类型为T的参数返回一个bool值。例如,表达式comp(a, b),comp是Compare类型,且a和b是容器中的元素,那么在“弱排序准则”下如果a在b的前面则会返回true。priority_queue使用这个函数来在内部维持堆的性质。(例如,pop会弹出在弱排序准则下的最后一个元素)。它可以是函数指针也可以是函数对象,默认是less,返回值与a<b相同。

成员函数

构造函数
/* 初始化 */
priority_queue(const Compare& comp, const Container& ctnr);
/* 范围 */
template <class InputIterator>
priority_queue(InputIterator first, InputIterator last, const Compare& comp, const Container& ctnr);
/* 举例 */
class mycomparison
{
  bool reverse;
public:
  mycomparison(const bool& revparam=false)
    {reverse=revparam;}
  bool operator() (const int& lhs, const int&rhs) const
  {
    if (reverse) return (lhs>rhs);
    else return (lhs<rhs);
  }
};

int main ()
{
  int myints[]= {10,60,50,20};

  std::priority_queue<int> first;
  std::priority_queue<int> second (myints,myints+4);
  std::priority_queue<int, std::vector<int>, std::greater<int> >
                            third (myints,myints+4);
  // using mycomparison:
  typedef std::priority_queue<int,std::vector<int>,mycomparison> mypq_type;

  mypq_type fourth;                       // less-than comparison
  mypq_type fifth (mycomparison(true));   // greater-than comparison

  return 0;
}
其它
empty()
size()
top() // 顶部元素,弱排序准则下最后一个元素,即“最大的”元素
push()
pop() // 弹出顶部元素
emplace()
swap()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值