2014-11-02 76 views
6

我想实现一个A *算法,我需要一个优先级队列,但std::priority_queue不适合我,因为我需要找到一个元素(一个Node对象)是否在priority_queue中,以访问其数据并在必要时进行修改。C++优先级队列查找和修改对象

我能以某种方式使用std::priority_queue吗?

我会很感激代码的建议,因为我没有太多的经验std::priority_queue

+1

你不能使用front()并遍历它吗? – 2501 2014-11-02 14:41:51

+0

boost :: bimap呢? – 2014-11-02 15:24:09

+1

请注意,标准库容器通常会在效率低下时避免提供操作。在通常的优先级队列实现(使用堆)中,搜索和成员资格测试具有O(N)复杂性,这可能是为什么此操作不是内置的。这可能会或可能不会成为您的应用程序的问题。只要注意你需要多久才需要测试会员资格。 – 2014-11-02 15:43:30

回答

1

“,但在STL :: priority_queue不适合我,因为我需要找到一个元素(节点对象)是否在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>),而不是值或原始指针。课程当然需要适当调整。


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; 

“即可访问其数据,并在必要时对其进行修改。”

使用优先级队列std::shared_ptr如上述样品中,也可以从连放了你需要找到实例在队列中,并同步从原始实例数据修改。

+0

'value_type'应该放在'class Compare = std :: less '中吗? – mariya 2014-11-02 15:33:55

+1

@ mariya至于我的示例'std :: shared_ptr '。你必须自己实现这个,因为我试着在我的示例中用'CompareNodes'来演示。 – 2014-11-02 15:39:21