STL学习——Priority_queue篇

来源:互联网 发布:知乎机构号申请 编辑:程序博客网 时间:2024/05/02 10:16

STL学习——Priority_queue篇

  • 概述

    priority_queue是一个拥有权值观念的queue,它允许加入新元素,移除旧元素,审视元素值等功能。因为它是queue,故只允许底端加入元素,顶端取出元素。priorit_queue内元素并非依照被推入的次序排列,而是依照元素权值排列。权值最高者,排在最前面。

  • 实现

    priority_queue利用max_heap和vector表现的完全二叉树实现。它的实现完全以底部容器为根据,并使用heap处理规则,故实现简单。默认情况,使用vector为底部容器。由于它有“修改某物接口,形成另一风貌”性质,为适配器,被称为容器适配器。它不提供迭代器,也不提供遍历操作。其实现元素如下:

    // priority_queue类定义template <class _Tp,           class _Sequence __STL_DEPENDENT_DEFAULT_TMPL(vector<_Tp>),          class _Compare          __STL_DEPENDENT_DEFAULT_TMPL(less<typename _Sequence::value_type>) >class priority_queue {...public:  typedef typename _Sequence::value_type      value_type;  typedef typename _Sequence::size_type       size_type;  typedef          _Sequence                  container_type;  typedef typename _Sequence::reference       reference;  typedef typename _Sequence::const_reference const_reference;protected:  _Sequence c;      // 底层容器  _Compare comp;    // 元素大小比较标准public:  priority_queue() : c() {}  explicit priority_queue(const _Compare& __x) :  c(), comp(__x) {}  // 以下用到的make_heap(),push_heap(),pop_heap()都是泛型算法  // 注意,任一个构造函数都立刻位于底层容器内产生一个implicit represention heap  priority_queue(const _Compare& __x, const _Sequence& __s)     : c(__s), comp(__x)     { make_heap(c.begin(), c.end(), comp); }#ifdef __STL_MEMBER_TEMPLATES  template <class _InputIterator>  priority_queue(_InputIterator __first, _InputIterator __last)     : c(__first, __last) { make_heap(c.begin(), c.end(), comp); }  template <class _InputIterator>  priority_queue(_InputIterator __first,                  _InputIterator __last, const _Compare& __x)    : c(__first, __last), comp(__x)     { make_heap(c.begin(), c.end(), comp); }  template <class _InputIterator>  priority_queue(_InputIterator __first, _InputIterator __last,                 const _Compare& __x, const _Sequence& __s)  : c(__s), comp(__x)  {     c.insert(c.end(), __first, __last);    make_heap(c.begin(), c.end(), comp);  }#else /* __STL_MEMBER_TEMPLATES */  priority_queue(const value_type* __first, const value_type* __last)     : c(__first, __last) { make_heap(c.begin(), c.end(), comp); }  priority_queue(const value_type* __first, const value_type* __last,                  const _Compare& __x)     : c(__first, __last), comp(__x)    { make_heap(c.begin(), c.end(), comp); }  priority_queue(const value_type* __first, const value_type* __last,                  const _Compare& __x, const _Sequence& __c)    : c(__c), comp(__x)   {     c.insert(c.end(), __first, __last);    make_heap(c.begin(), c.end(), comp);  }#endif /* __STL_MEMBER_TEMPLATES */  // 判断priority_queue是否为空  bool empty() const { return c.empty(); }  // 返回priority_queue大小  size_type size() const { return c.size(); }  // 返回priority_queue队首元素  const_reference top() const { return c.front(); }  // priority入队操作  void push(const value_type& __x) {    __STL_TRY {      // push_heap是泛型算法,先利用底层容器的push_back()将新元素推入末端,再重排heap。      c.push_back(__x);       push_heap(c.begin(), c.end(), comp);   // push_heap是泛型算法    }    __STL_UNWIND(c.clear());  }  // priority_queue出队操作  void pop() {    __STL_TRY {      // pop_heap是泛型算法,从heap内取出一个元素。他并不是真正将元素弹出,而是重排heap,然后在以底层容器的pop_heap()取得被弹出的元素      pop_heap(c.begin(), c.end(), comp);      c.pop_back();    }    __STL_UNWIND(c.clear());  }};...
  • 参考文献

    STL源码剖析——侯捷

    STL源码

0 0