改变vector中的值后,Make_heap没有按预期工作
make_heap not working as expected after changing value in vector?
我试图实现Dijkstra的算法与堆使用make_heap,这(希望)排序在减少值顺序的矢量为了使优先级队列,但由于某种原因排序得到所有错误,如果我改变一个值,我不知道为什么。
代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<float> heap;
for(int i=0;i<5;i++) heap.push_back(1e9);
heap[0] = 0; // <=== this is a problem for make_heap
for(int i=0;i<heap.size();i++) cout << heap[i] << ' ';
cout << endl;
make_heap(heap.begin(),heap.end());
for(int i=0;i<heap.size();i++) cout << heap[i] << ' ';
cout << endl;
return 0;
}
输出:Success time: 0 memory: 3468 signal:0
0 1e+09 1e+09 1e+09 1e+09
1e+09 1e+09 0 1e+09 1e+09
一个有趣的事情是,如果我改变heap[0] = 0
到heap.push_back(0)
之前推其他元素的排序工作完美。
Success time: 0 memory: 3468 signal:0
0 1e+09 1e+09 1e+09 1e+09 1e+09
1e+09 1e+09 1e+09 1e+09 1e+09 0
会是什么呢?
c++标准没有指定标准库应该如何实现堆。所以你不应该期待一个具体的安排。c++标准只指定了行为。
TL;博士;
heap[0] = 0
与heap.push_back(0)
之间存在差异。前者不会改变容器的大小,而后者会。奇数/偶数大小的容器的堆表示可能不同;没关系,我们想要的只是在使用适当的函数访问它时的堆行为。
同样,无论何时使用std::make_heap
之类的函数,都应该使用其关联函数(std::push_heap
和std::pop_heap
)来访问容器(这保证维护容器的堆属性)。
对它的任何其他修改都可能导致容器失去堆属性。这包括:
heap[0] = 0;
甚至:
heap.push_back(0)
对于所有i> 0的堆,heap[i] <= heap[(i - 1)/2]是有效的。
在这两种情况下,make_heap()都在创建一个有效的堆。第一个有5个元素,第二个有6个。我不明白你的部分问题,但它们似乎与make_heap()无关。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 由于缺少符号,WinDbg !heap命令无法工作