我有一個我想用來創建堆的矢量。我不確定是否應該使用C++ make_heap函數或將我的向量放在優先級隊列中?在性能方面哪個更好?我應該什麼時候使用一個與另一個?什麼時候應該使用make_heap與優先級隊列?
回答
性能溫度沒有差別。 std::priority_queue
只是一個適配器類,它將容器和與堆相關的函數調用包裝到一個類中。 std::priority_queue
的規範公開聲明。
通過從暴露的std::vector
(通過直接調用與堆相關的函數)構建一個基於堆的優先級隊列,您可以保持對外部訪問的可能性的打開,可能會損壞堆/隊列的完整性。 std::priority_queue
充當限制訪問「規範」最小值的障礙:push()
,pop()
,top()
等。您可以將其視爲自律執行措施。另外,通過使您的隊列接口適應「規範」操作集,您可以使其與基於相同外部規範的其他基於類的優先級隊列實現相互統一併可互換。
priority_queue(至少通常)是作爲堆實現的。因此,真正的問題是priority_queue是否提供您所需要的。當你使用make_heap時,你仍然可以訪問所有元素。當你使用priority_queue時,只有少數幾個操作對元素進行非常有限的訪問(基本上只需插入一個項目,然後刪除隊列頭部的項目)。
priority_queue
不是容器。它是使用特定底層容器的容器適配器,例如vector
或deque
,並提供一組特定的方法來處理數據。而且,它的實現依賴於*_heap
算法。
例如,無論您何時將新值推送到vector
,您都應該撥打push_heap
來擴展視爲堆的範圍。如果您不使用priority_queue
,它可以讓您考慮vector
的一半(std::make_heap(v.begin(), v.begin() + (v.size()/2))
),而另一半則爲原樣。
什麼priority_queue
確實,當你調用它的push
:它推動了新的元素基礎容器的後面,並呼籲push_heap
保持優先級堆屬性(只在乎的第一個元素是最大的)。
我會說你最好考慮解決方案的設計和你的具體要求,而不是性能問題。
如果你不想修改那個向量,那麼你應該使用優先級隊列,因爲它會創建一個單獨的向量(需要額外的空間)。而且,它很容易實現。例如,當你在使用make_heap的同時彈出一個元素時,你必須使用兩個命令,首先是pop_heap,然後是pop_back ..但是如果是優先級隊列,只需一個命令即可。同樣,將元素推入堆中。
現在,兩者的性能都是相同的,因爲優先級隊列不是容器,它使用一些底層容器作爲矢量或deque,它使用make_heap操作所使用的相同堆操作。因此,您應該根據您的要求。
- 1. java優先級隊列隊列適應
- 2. 什麼時候優先在堆上使用單鏈表實現優先級隊列?
- 3. 優先級隊列中的優先級
- 4. 優先級隊列
- 5. 我們什麼時候應該使用DbSet與EF代碼優先
- 6. STL優先隊列:什麼時候/如何進行度假?
- 7. Dijkstra算法使用優先級隊列
- 8. 使用鏈表的優先級隊列
- 9. 使用優先級隊列結構嗎?
- 10. 什麼時候應該使用AWS,什麼時候不使用
- 11. Java優先級隊列
- 12. PHP Sendmail隊列優先級
- 13. 雙重優先級隊列
- 14. Objective-c優先級隊列
- 15. 優先級隊列,可比
- 16. Amazon SQS優先級隊列
- 17. 關鍵 - 優先級隊列
- 18. 的Java:優先級隊列
- 19. 優先級隊列C
- 20. 樹和優先級隊列
- 21. 優先級隊列在python
- 22. 優先級隊列VS隊列
- 23. 什麼時候應該使用sed,什麼時候應該使用awk
- 24. 什麼時候應該使用memcpy,什麼時候應該使用memmove?
- 25. 什麼時候應該使用Import-Package,什麼時候應該使用Require-Bundle?
- 26. 優先級隊列的時間?
- 27. 什麼時候應該使用async/await,什麼時候不用?
- 28. Java優先級隊列應該如何工作?
- 29. 如何將java優先級隊列轉換爲C++優先級隊列?
- 30. 什麼時候應該在我的項目中使用EF代碼優先或模型優先?
好吧,如果你想要一堆,你應該把它堆成一堆。優先級隊列並非全部堆積如山。堆往往表現更好。 – Wug