C ++优先级队列,用于查找和修改对象

时间:2014-11-02 14:37:48

标签: c++ stl priority-queue

我正在尝试实现一个A *算法,我需要一个优先级队列,但std::priority_queue对我不起作用,因为我需要查找一个元素(一个Node对象)是否在priority_queue中,以访问其数据并在必要时进行修改。

我可以使用std::priority_queue以某种方式执行此操作吗?

我很感谢代码建议,因为我对std::priority_queue没有多少经验。

1 个答案:

答案 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优先级队列,也可能使您无需在队列中查找实例,并且同步来自原始实例的数据修改。