初始化并插入优先级队列 (C++)

Posted

技术标签:

【中文标题】初始化并插入优先级队列 (C++)【英文标题】:Initializing and Inserting into a Priority Queue (C++) 【发布时间】:2014-02-15 22:11:30 【问题描述】:

我以前从未使用过 STL C++ 优先级队列,我发现网站上的详细信息有点混乱。

我想创建一个节点的优先级队列,我定义为:

struct Node 
   string data;
   int weight;
   Node *left, *right;

我还根据节点的权重按升序插入队列。但是,我不知道最终的 PQ 中会有多少个节点。

我对使用哪个构造函数来创建 PQ 感到困惑。目前,我有:

std::priority_queue<Node> myQueue;

但是由于我希望队列根据节点的权重进行排序,我应该使用构造函数吗:

priority_queue (const Compare& comp, const Container& ctnr);

这行得通吗?在那种情况下,ctnr 会“节点”吗?

最后,当我想将一个元素推入priority_queue(使用STL priority_queue::push)时,该元素会自动放置在正确的位置吗?

谢谢。

【问题讨论】:

【参考方案1】:

初始化并不能确定优先级队列的操作方式。如果您希望它以特定方式排序,您有两种选择。

第一个选项是在您的 Node 对象上定义 &lt; 运算符,以便按照您想要的方式比较它们。

struct Node 
   string data;
   int weight;
   Node *left, *right;
   bool operator<(const Node& n) const 
      return weight < n.weight;
      // or "weight > n.weight" if you want the smallest weight at the top
   
;
std::priority_queue<Node> myQueue;

第二个选项是定义自定义比较器类型并将其指定为模板参数

struct NodeComp 
   bool operator()(const Node& n1, const Node& n2) const 
      return n1.weight < n2.weight;
      // or "n1.weight > n2.weight" if you want the smallest weight at the top
   
;
std::priority_queue<Node, std::vector<Node>, NodeComp> myQueue;

【讨论】:

我很想知道:在每个节点中包含comparator,特别是当节点很大时,会导致任何性能问题吗? 函数不占用对象内部空间。 是的,我也很好奇 Node.js 中 operator 【参考方案2】:

你可以使用:

struct cmp

    bool operator() (Node const &a,  Node &b)  return a.weight < b.weight; 
;
typedef std::priority_queue<Node, std::vector<Node>,cmp> My_queue;  

当我想将一个元素推入priority_queue(使用STL priority_queue::push)时,该元素会自动放置在正确的位置吗?

是的。

希望这会有所帮助,不要混淆!

【讨论】:

哦,我明白了。所以你必须传入一个比较器?谢谢。

以上是关于初始化并插入优先级队列 (C++)的主要内容,如果未能解决你的问题,请参考以下文章

[转]c++优先队列(priority_queue)用法详解

c++优先队列(priority_queue)用法详解

如何在 C++ 中正确使用优先级队列

关于C++的权值优先队列的问题

C++ 标准模板库优先级队列抛出异常并显示消息“无效堆”

[ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解