我想知道为什么堆概念实现为算法(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