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

What is the difference between these two priority queue wrappers?

本文关键字:包装 什么 区别 队列 优先级 两个      更新时间:2023-10-16

我正在为大学项目创建一个* 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;
    }
};

请注意,我对这两个实现的幕后发生的事情不感兴趣,除非它与我用于与它们接口的功能产生的输出更改相关。

因此,原因是,std::priority_queue以不同顺序与std::vector返回相同优先级的元素。我意识到,发现答案后可能是一个愚蠢的问题,但是收到相同优先级要素的顺序影响了我的算法的效率。抱歉,我认为有人可能会发现这个问题很有趣。