c++映射到最小堆中
c++ map into min heap
我想知道一种简单的方法来获得(Map+min Heap)数据结构在C++中
我试过这个:
struct Comp
{
bool operator()(const pair<int,int>& y , const pair<int,int>& z)
{
return (y.second < z.second);
}
};
priority_queue< pair<int,int> , map<int,int> , Comp > p;
现在我面临的问题是重新初始化,因为它在priority_queue
中,我们不能像在maps
中那样简单地初始化
插入元素的唯一方法是
p.push(make_pair(value1,value2));
我也尝试过使用简单的映射,而不是将其与priority_queue
一起使用,但问题再次出现,当我尝试使用min_element
找到最小元素时,它会返回值,而不是这里也需要的键。
请提出解决问题的最快方法。我也相信,在我所知的范围之外,还有一些可能的方法。
否,不能对优先级队列中的元素进行索引以更改值。您要么必须使用changeKey()
操作(顺便说一下,这可以非常优化)自己实现整个优先级队列,要么做一些其他变通方法。
我为Prim算法计算最小生成树实现了一个具有decreaseKey()
操作的优先级队列。如果你想实现优先级队列,那么你可以在这里查看我的答案,或者在这里查看Gassa的答案。
如果您查看了第一条注释,并按照priority_queue文档的链接进行操作,那么您就拥有了所需的所有工具。
假设你已经在某个地方定义了一条边。比方说
struct edge {
int vertex1, vertex2;
int weight;
bool operator> (const edge &ref) const {return weight > ref.weight;}
};
您需要一个堆,根据文档,它应该基于vector或deque。我通常更喜欢矢量,但我把deque放在这里只是为了好玩。文档说,如果你想要一个最小堆,就使用std::greater,因此你还必须实现edge::operator>
#include <queue> // std::priority_queue and std::deque
#include <functional> // std::greater
typedef std::priority_queue<edge, std::deque<edge>, std::greater<edge> > djikstra_heap;
现在你可以推边并获得最小
edge e1{ 1, 2, 2 };
edge e2{ 1, 3, 4 };
djikstra_heap heap;
heap.push(e1);
heap.push(e2);
edge first_result = heap.top(); heap.pop();
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 将函数类成员映射到类本身内部
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 使用std::函数映射对象方法
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++映射分割错误(核心转储)
- 内联映射初始化的动态atexit析构函数崩溃
- 使用"std::unordereded_map"映射到"std::list"对象
- 如何从多映射中删除特定的重复项
- 在未初始化映射的情况下,将值插入到映射的映射中
- QT通过C++添加映射QML项目
- 在c++中访问int到类对象的映射时出错
- 在C++中搜索嵌套多映射值
- 错误处理.将系统错误代码映射到泛型
- C++匿名结构作为std::映射值
- 如何从存储在std::映射中的std::集中删除元素
- 递归无序映射
- 正在VS调试器中监视映射条目