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

时间:2014-02-15 22:11:30

标签: c++ priority-queue

之前我从未使用过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)时,该元素会自动放在正确的位置吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

初始化不确定优先级队列的运行方式。如果您希望它按特定方式排序,您有两种选择。

第一个选项是在<个对象上定义Node运算符,以便按照您想要的方式对其进行比较。

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;

答案 1 :(得分:1)

您可以使用:

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)时,元素会自动放在正确的位置吗?

是的。

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