我想知道爲什麼堆概念實現爲算法(make_heap
,pop_heap
, push_heap
,sort_heap
)而不是容器。我特別感興趣的是某些人的解決方案也可以解釋爲什麼set
和map
是容器而不是類似的算法集合(make_set add_set rm_set等)。爲什麼C++中的堆實現爲算法而不是容器?
回答
STL確實提供了std :: priority_queue形式的堆。 make_heap等功能在那裏,因爲它們在數據結構本身的領域之外使用(例如排序),並允許在定製結構之上構建堆(比如堆棧數組爲「保持前10位」容器)。通過類推,你可以使用一個std :: set存儲一個排序列表,或者你可以在std :: adjacent_find上使用std :: sort作爲一個向量; std :: sort是更通用的,並且對底層數據結構做了很少的假設。
(作爲一個說明,在std :: priority_queue實施實際上並沒有提供它自己的存儲;默認情況下它會創建一個std ::向量作爲其後備存儲)
那麼,堆不是一個真正的通用容器,就像集合或地圖一樣。通常,您使用堆來實現其他抽象數據類型。 (最明顯的是優先隊列。)我懷疑這是不同治療的原因。
一個明顯的原因是你可以將元素排列成裏面的另一個容器。
因此,您可以撥打make_heap()
vector
或deque
甚至C數組。
堆是一個特定的數據結構。標準容器具有複雜性要求,但未指定如何實施。這是一個很好但很重要的區別。你可以在幾個不同的容器上使用make_heap
,包括你自己寫的一個容器。但set
或map
不僅僅是一種安排數據的方式。
換句話說,標準容器不僅僅是它的基礎數據結構。
堆*幾乎總是使用數組作爲基礎數據結構實現的。因此,它可以被認爲是對陣列數據結構進行操作的一組算法。這是STL在實現堆時所採用的路徑 - 它可以用於任何具有隨機訪問迭代器(標準數組,矢量,雙端隊列等)的數據結構。
您還會注意到STL priority_queue需要一個容器(默認情況下它是一個向量)。這實質上就是你的堆容器 - 它在你的底層數據結構上實現了一堆,併爲所有典型的堆操作提供了一個包裝容器。
*特別是二進制堆。其他形式的堆(二項式,斐波納契等)不是。
- 1. 爲什麼堆棧彈出(而不是+
- 2. 爲什麼作爲指針的類實例使用堆而不是堆棧?
- 3. C++ - 爲什麼要op + =而不是其他方式實現op +?
- 4. 爲什麼將xts實現爲矩陣而不是數據框?
- 5. 爲什麼java.util.Stack是使用Vector實現的而不是Arraylist
- 6. 爲什麼在堆,而不是變量本身在C++
- 7. 爲什麼在Android中使用ContextImpl實現Context而不是ContextWrapper?
- 8. 爲什麼在Iterable中實現zipWithIndex而不是Traversable?
- 9. 爲什麼Java提供規範而不是實現
- 10. 爲什麼使用數組而不是BT實現分段樹
- 11. 爲什麼包含頭文件而不是實現?
- 12. 爲什麼SortedList實現使用ThrowHelper而不是直接拋出?
- 13. 爲什麼說「協作」實現「用例」而不是反之呢?
- 14. 爲什麼類會顯式而不是隱式地實現IDisposable?
- 15. 爲什麼要使用鏈接列表而不是數組或矢量實現來實現堆棧或隊列?
- 16. 在C++中爲堆提取min實現
- 17. C++ 11已實現的接口方法不可用。爲什麼?
- 18. 爲什麼Servlet.service()方法返回void而不是ServletResponse的實例?
- 19. 爲什麼MEF不是DI/IoC容器?
- 20. 實現Serializable爲您提供什麼優勢而不是簡單的方法?
- 21. MinMax堆算法實現
- 22. 與C++兼容的SLAM算法實現?
- 23. 爲什麼在C++ STL中分離算法,迭代器和容器STL
- 24. 爲什麼Unity不能注入一個具體的容器實現而不是IUnityContainer?
- 25. 容器中(而不是作爲一組!)
- 26. 爲什麼你必須在目標C中編寫接口和實現,而不是實現
- 27. 爲什麼有人會使用乘法而不是乘法器
- 28. 爲什麼字符串實現可比較而不是比較器接口
- 29. 爲什麼typeof被稱爲運算符而不是函數?
- 30. 容器<ImplementerOfIInterface>不是容器<IInterface>。爲什麼不?
爲了記錄在案,有一堆基於容器:'priority_queue'。 – avakar 2010-06-30 18:33:56
爲什麼不能?對於堆,您可以使用任何隨機訪問序列。不要強迫你使用特殊的容器是好的。人們應該嘗試去分離事物。不,集合和地圖在使用序列時效果不佳。爲這些使用實際的二叉樹要容易得多。 – sellibitze 2010-06-30 19:06:35
由於有些人似乎很困惑:kts指的是數據結構[http://en.wikipedia.org/wiki/Heap_(data_structure)],而不是免費的商店。 – 2010-06-30 21:18:02