如何使用模板实现minheap

时间:2010-09-19 09:43:14

标签: c++ templates

我需要创建一个minheap模板,其中包含节点。

我遇到的问题是我不知道是否需要创建节点模板类,还是应该作为结构包含在堆模板类中?

2 个答案:

答案 0 :(得分:3)

最小堆通常不会(从不?)使用显式节点实现 - 因为堆始终是左填充(“完整”),因此具有明确定义的结构,由于节点的处理,这将是不必要的低效率和节点链接引入了相当多的开销,更不用说破坏引用的局部性,导致缓存未命中和性能不佳。

(当然,最大堆也是如此。)

相反,它们是使用数组实现的。事实上,C ++标准库已经包含函数make_heappush_heappop_heap来处理迭代器范围。将它们与vector结合使用,就可以得到你的堆。

答案 1 :(得分:1)

基本上,节点不需要用节点作为模板类来实现。 实现可能类似于这个声明:

template <class T>
class MinHeap {
private:
    std::vector<T> _heap;
    int _maxSize;
    int _size;

public:
    MinHeap(int maxSize);
    ~MinHeap();
    void Insert(T elem);
     T RemoveMin();

private:
    int LeftChild(int pos);
    int RightChild(int pos);
    int Parent(int pos);
    boolean IsLeaf(int pos);
    void Swap(int pos1, int pos2);
    void PushDown(int position);
};