我想实现一个A *算法,我需要一个优先级队列,但std::priority_queue
不适合我,因为我需要找到一个元素(一个Node
对象)是否在priority_queue
中,以访问其数据并在必要时进行修改。C++优先级队列查找和修改对象
我能以某种方式使用std::priority_queue
吗?
我会很感激代码的建议,因为我没有太多的经验std::priority_queue
。
我想实现一个A *算法,我需要一个优先级队列,但std::priority_queue
不适合我,因为我需要找到一个元素(一个Node
对象)是否在priority_queue
中,以访问其数据并在必要时进行修改。C++优先级队列查找和修改对象
我能以某种方式使用std::priority_queue
吗?
我会很感激代码的建议,因为我没有太多的经验std::priority_queue
。
“,但在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
如上述样品中,也可以从连放了你需要找到实例在队列中,并同步从原始实例数据修改。
'value_type'应该放在'class Compare = std :: less
@ mariya至于我的示例'std :: shared_ptr
你不能使用front()并遍历它吗? – 2501 2014-11-02 14:41:51
boost :: bimap呢? – 2014-11-02 15:24:09
请注意,标准库容器通常会在效率低下时避免提供操作。在通常的优先级队列实现(使用堆)中,搜索和成员资格测试具有O(N)复杂性,这可能是为什么此操作不是内置的。这可能会或可能不会成为您的应用程序的问题。只要注意你需要多久才需要测试会员资格。 – 2014-11-02 15:43:30