这两个优先级队列包装器有什么区别?

时间:2016-11-29 18:02:31

标签: c++ stl implementation priority-queue

我正在为大学项目创建A *的线程安全版本,并遇到这个奇怪的问题,其中优先级队列的这两个实现产生不同的结果。我已经盯着这一段时间了,我开始忽视实际的项目工作。有人能发现这两种实现之间的区别吗?

template<typename T, typename priority_t>
struct PriorityQueue 
{
  typedef pair<priority_t, T> PQElement;

  class Compare
  {
  public:
      bool operator() (PQElement e1, PQElement e2)
      {
          return e2.first < e1.first;
      }
  };

  priority_queue<PQElement, vector<PQElement>,
      Compare> elements;

  inline bool empty() const { return elements.empty(); }

  inline void put(T item, priority_t priority) {
      elements.emplace(priority, item);
  }

  inline T get() {
      T best_item = elements.top().second;
      elements.pop();
      return best_item;
  }
};

第二个实现

  template<typename T, typename priorityT>
  struct PriorityQueue {
    typedef pair<priorityT, T> PQElement;
    vector<PQElement> elements;

    inline bool empty() const { return elements.empty(); }

    inline void put(T item, priorityT priority)
    {
        elements.push_back(PQElement(priority, item));
        std::sort(elements.begin(), elements.end(), [&](PQElement e1, PQElement e2) { return e2.first < e1.first; });
    }

    inline T get() {
        PQElement bestItem = elements.back();
        elements.pop_back();
        return bestItem.second;
    }
};

请注意,我对这两个实现的幕后内容不感兴趣,除非它与我用来与它们交互的函数产生的输出变化有关。

1 个答案:

答案 0 :(得分:0)

原因是,std::priority_queue以与std::vector不同的顺序返回相同优先级的元素。我发现在发现答案之后这可能是一个愚蠢的问题,但是接收相同优先级元素的顺序会影响我算法的效率。对不起,我觉得有人可能会觉得这个问题很有趣。