之前我从未使用过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)时,该元素会自动放在正确的位置吗?
谢谢。
答案 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)时,元素会自动放在正确的位置吗?
是的。
希望这有所帮助,不要混淆!