c++数据结构——堆(可重载规则)

使用了模板函数指针,默认指向模板类静态成员函数

#include <iostream>
#include <vector>
using namespace std;

template <typename T>
class Heap {
  private:
    static bool les_(const T &l, const T &r) { return l < r; }
    static bool greater_(const T &l, const T &r) { return l > r; }

  private:
    vector<T> data_;
    bool (*cmp_)(const T &l, const T &r);

    void push_up() {
        if (data_.size() <= 1) return;
        int i = data_.size() - 1, tmp = data_[i];
        while (i > 0) {
            int nex = i / 2;
            if (cmp_(tmp, data_[nex])) break;
            data_[i] = data_[nex], i = nex;
        }
        data_[i] = tmp;
    }

    void push_down() {
        if (data_.size() <= 1) return;
        int i = 0, tmp = data_[i];
        while (i * 2 < data_.size()) {
            int nex = i * 2 + (i * 2 + 1 < data_.size() && cmp_(data_[i * 2], data_[i * 2 + 1]));
            if (cmp_(data_[nex], tmp)) break;
            data_[i] = data_[nex], i = nex;
        }
        data_[i] = tmp;
    }

  public:
    Heap(bool less = 1) { cmp_ = less ? les_ : greater_; }
    Heap(bool (*p)(const T &, const T &)) { cmp_ = p; }
    ~Heap() {}

    void push(T x) {
        data_.push_back(x);
        push_up();
    }

    void pop() {
        if (data_.empty()) return;
        data_[0] = data_.back();
        data_.pop_back();
        push_down();
    }

    T top() { return data_[0]; }
    int size() { return data_.size(); }
};

template <typename T>
bool les_(const T &l, const T &r) { return l < r; }

int main() {
    Heap<int> a(les_);
    a.push(1);
    a.push(3);
    a.push(4);
    a.push(6);
    a.push(5);
    a.push(2);
    while (a.size()) {
        cout << a.top() << endl;
        a.pop();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岚花落_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值