[英]make_heap not working as expected after changing value in vector?
我正在嘗試使用make_heap來實現Dijkstra的算法,其中(希望)按遞減值順序對向量進行排序以便創建優先級隊列,但由於某種原因,如果我更改了值並且我沒有,則排序會全部出錯想法為什么。
#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 ++標准未指定標准庫應如何實現Heap。 所以你不應該期待具體的安排。 C ++標准僅指定行為。
TL; DR;
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的堆[i] <= heap [(i - 1)/ 2]。
在這兩種情況下,make_heap()都在創建一個有效的堆。 第一個有5個元素,第二個有6個。我不理解你的問題的部分,但它們似乎與make_heap()無關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.