继续 列表到优先队列

我正在通过随机访问实现改进的Priority_queue。

template <class T, class Container = std::vector<T> >
class Heap {
public:
    Heap() {}

    Heap(const Container& container) {
        container_ = container;
        std::make_heap(container_.begin(), container_.end());
    }

    Heap<T, Container>& operator=(const Heap<T, Container>& heap) {
        if (this != &heap)
            container_ = heap.container_;

        return *this;
    }

    void push(const T& x) {
        container_.push_back(x);
        std::push_heap(container_.begin(), container_.end());
    }

    void pop() {
        std::pop_heap(container_.begin(), container_.end());
        container_.pop_back();
    }

    const T& top() {
        return container_.front();
    }

    const Container& getContainer() const {
        return container_;
    }

    T& operator[](size_t n) {
        return container_[n];
    }

    typename Container::const_iterator begin() const {
        return container_.begin();
    }

    typename Container::const_iterator end() const {
        return container_.end();
    }

    size_t size() const {
        return container_.size();
    }

    T& base() {
        return container_.back();
    }

    Container::iterator erase(Container::iterator position) {
        return container_.erase(position);
    }

private:
    Container container_;
};

我走正确的方法吗?

  • 修复了一般的构造函数。
  • 改进的代码。
有帮助吗?

解决方案

对我来说看起来不太好:

  • 一般的构造函数应通过const参考进行论证。
  • 任务操作员没有检查自我分配。
  • getContainer() 方法显示界面中缺乏清晰度 - 为什么您只是简单地公开这样的实现细节?
  • 最重要的是:为什么要“随机访问优先队列”?

其他提示

您的pop()方法可以违反堆顺序。使用pop_heap()代替pop_back()。我似乎现在找不到其他错误。

您可以通过推动随机整数并逐一来轻松测试这种实现。您应该以分类顺序使它们恢复。这被称为堆排序。

建议:

  • 您可以将RED返回到容器中,而是可以将常量迭代器实现为此类。

  • 请注意,您不应更改随机访问的元素的键,因为它可能会破坏堆结构。如果您需要这样的功能,则应实现Change_key函数,该功能将安全更改密钥并维护堆顺序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top