我正在尝试实现一个A *算法,我需要一个优先级队列,但std::priority_queue
对我不起作用,因为我需要查找一个元素(一个Node
对象)是否在priority_queue
中,以访问其数据并在必要时进行修改。
我可以使用std::priority_queue
以某种方式执行此操作吗?
我很感谢代码建议,因为我对std::priority_queue
没有多少经验。
答案 0 :(得分:1)
"但是stl :: priority_queue对我来说不起作用,因为我需要查找一个元素(一个Node对象)是否在priority_queue中,以访问它的数据和如有必要,可以对其进行修改。"
对于提供适当的Compare
类参数的任何类,您都可以这样做。
std::priority_queue<T>
要求基础Container
符合SequenceContainer
的概念。
template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
> class priority_queue;
您可以获取std::priority_queue<T>::front()
引用的地址,并遍历队列,以查找某些实例。
如果你真的需要拥有唯一存在的对象实例,那么应该通过一些优先级算法来管理它,最好存储智能指针(例如std::shared_ptr<T>
),而不是值或原始指针。 Compare
课程当然需要适当调整。
struct CompareNodes {
bool operator
( const std::shared_ptr<Node>& lhs
, const std::shared_ptr<Node>& rhs
) {
// Provide some operation to compare lhs < rhs (less) results in true
// This function is meant to determine the actual priority of your Node
// instances, when referenced in the priority_queue<> in question.
}
};
std::priority_queue
< std::shared_ptr<Node>
, std::vector<std::shared_ptr<Node>>
, CompareNodes
> myQueue;
&#34;访问其数据并在必要时进行修改。&#34;
使用上面示例中显示的std::shared_ptr
优先级队列,也可能使您无需在队列中查找实例,并且同步来自原始实例的数据修改。