⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fenced_priority_queue.hpp

📁 CGAL is a collaborative effort of several sites in Europe and Israel. The goal is to make the most i
💻 HPP
字号:
//  (C) Copyright Jeremiah Willcock 2004 //  Distributed under the Boost Software License, Version 1.0. (See//  accompanying file LICENSE_1_0.txt or copy at//  http://www.boost.org/LICENSE_1_0.txt)#ifndef BOOST_FENCED_PRIORITY_QUEUE_HPP#define BOOST_FENCED_PRIORITY_QUEUE_HPP#include <vector>#include <queue>#include <functional>#include <boost/pending/queue.hpp>// Fenced priority queue// Jeremiah Willcock// This class implements a fenced priority queue.  This is similar to// a normal priority queue (sorts its members, and only returns the// first), except that members cannot be sorted around a "fence" that// can be placed into the buffer.  This fence is inserted using the// fence() member function or (possibly) implicitly by the top() and// pop() methods, and is removed automatically when the elements// around it are popped.// The implementation is as follows:  Q is an unsorted queue that// contains the already-sorted list data, and PQ is a priority queue// that contains new elements (since the last fence) that have yet to// be sorted.  New elements are inserted into PQ, and a fence moves// all elements in PQ into the back of Q in sorted order.  Elements// are then popped from the front of Q, and if that is empty the front// of PQ.namespace boost {  template<class T, class Compare = std::less<T>, bool implicit_fence = true,           class Buffer = boost::queue<T> >  class fenced_priority_queue {  public:    typedef T value_type;    typedef typename Buffer::size_type size_type;    fenced_priority_queue(const Compare _comp = Compare() )       : PQ(_comp) {}         void push(const T& data);    void pop(void);    T& top(void);    const T& top(void) const;    size_type size(void) const;    bool empty(void) const;    void fence(void);      private:    void fence(void) const;    //let them mutable to allow const version of top and the same     //semantics with non-constant version. Rich Lee    mutable std::priority_queue<T, std::vector<T>, Compare> PQ;    mutable Buffer Q;  };    template<class T, class Compare, bool implicit_fence, class Buffer>  inline void   fenced_priority_queue<T, Compare, implicit_fence, Buffer>::  push(const T &t) {    // Push a new element after the last fence.  This puts it into the    // priority queue to be sorted with all other elements in its    // partition.    PQ.push(t);  }  template<class T, class Compare, bool implicit_fence, class Buffer>  inline void fenced_priority_queue<T, Compare, implicit_fence, Buffer>::  pop(void) {    // Pop one element from the front of the queue.  Removes from the    // already-sorted part of the queue if it is non-empty, otherwise    // removes from the new-element priority queue.  Runs an implicit    // "fence" operation if the implicit_fence template argument is    // true.    if (implicit_fence) fence();    if ( !Q.empty() )      Q.pop();    else      PQ.pop();  }  template<class T, class Compare, bool implicit_fence, class Buffer>  inline T& fenced_priority_queue<T, Compare, implicit_fence, Buffer>::  top(void) {    // Get the top element from the queue.  This element comes from Q if    // possible, otherwise from PQ.  Causes an implicit "fence"    // operation if the implicit_fence template argument is true.    if (implicit_fence) fence();    if ( !Q.empty() )      return Q.top();    else      //std::priority_queue only have const version of top. Rich Lee      return const_cast<T&>(PQ.top());  }  template<class T, class Compare, bool implicit_fence, class Buffer>  inline const T&  fenced_priority_queue<T, Compare, implicit_fence, Buffer>::  top(void) const {    if (implicit_fence) fence();    if ( !Q.empty() )      return Q.top();    else      return PQ.top();  }  template<class T, class Compare, bool implicit_fence, class Buffer>  inline typename fenced_priority_queue<T, Compare, implicit_fence, Buffer>::size_type   fenced_priority_queue<T, Compare, implicit_fence, Buffer>::  size(void) const {    // Returns the size of the queue (both parts together).    return Q.size() + PQ.size();  }  template<class T, class Compare, bool implicit_fence, class Buffer>  inline bool   fenced_priority_queue<T, Compare, implicit_fence, Buffer>::  empty(void) const {    // Returns if the queue is empty, i.e. both parts are empty.    return Q.empty() && PQ.empty();  }    template<class T, class Compare, bool implicit_fence, class Buffer>  inline void   fenced_priority_queue<T, Compare, implicit_fence, Buffer>::  fence(void) {    // Perform a fence operation.  Remove elements from PQ in sorted    // order and insert them in the back of Q.    while ( !PQ.empty() ) {      Q.push(PQ.top());      PQ.pop();    }  }  template<class T, class Compare, bool implicit_fence, class Buffer>  inline void   fenced_priority_queue<T, Compare, implicit_fence, Buffer>::  fence(void) const {    // Perform a fence operation.  Remove elements from PQ in sorted    // order and insert them in the back of Q.    while ( !PQ.empty() ) {      Q.push(PQ.top());      PQ.pop();    }  }}  #endif /* BOOST_FENCED_PRIORITY_QUEUE_HPP */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -