实现可以在C ++中迭代的优先级队列

时间:2010-12-12 12:03:15

标签: c++ priority-queue

我需要为项目实现优先级队列,但是未指示STL的priority_queue,因为我们需要迭代所有元素并随机删除它们。

我们正在考虑使用STL的set,将它包装在一个类中以使其成为ADT。

对此有更聪明的解决方案吗?

我们如何才能使set的某些公共成员函数可以公开使用?我们对迭代器等感兴趣

由于缺少虚拟析构函数,显然导出STL是不明智的:/


新代码:

#ifndef PRIORITYQUEUE_H_
#define PRIORITYQUEUE_H_

#include <set>

template<typename T, template<typename X> class impl_type = std::set>
class PriorityQueue {
    typedef impl_type<T> set_type;
    typedef typename set_type::iterator iterator;
public:
    void push(const T& x) {
        insert(x);

    }

    void pop() {
        erase(begin());
    }

    const T& top() const {
        return *begin();
    }
};

#endif /* PRIORITYQUEUE_H_ */

所以,我们目前有这个。编译器不会抱怨插入,但它确实抱怨erase(begin())return *begin()

there are no arguments to 'begin' that depend on a template parameter, so a declaration of 'begin' must be available

为什么会这样?

4 个答案:

答案 0 :(得分:3)

您应该能够使用std::vectorstd::make_heapstd::push_heapstd::pop_heap来实现自己的优先级队列。这不是std::priority_queue的实施方式吗?删除随机元素时,您只需再次调用std::make_heap来修复数据结构。

您需要按顺序迭代元素吗?有一个std::sort_heap算法可以对基础std::vector进行排序。

答案 1 :(得分:2)

您真的需要优先级队列吗?

您需要遍历所有项目并随机删除 - &gt;链表

如果您需要对列表进行排序,请在开头对其进行排序,然后在插入新项目时使用插入排序(在正确的位置插入新项目)。

答案 2 :(得分:2)

STL的设置应该可用于制作你想要的东西,虽然我必须注意到要求列表看起来有点奇怪。你可以定义一个新类型。

template<typename T, template<typename X> class impl_type = std::set> class prio_queue {
    typedef impl_type<T> set_type;
    typedef typename set_type::iterator iterator;
    // etc
public:
    // Forward the set's members
    T& top() {
        return *begin();
    }
    // etc
};

答案 3 :(得分:1)

我将遵循标准库使用组合中的一些其他容器适配器设置的示例,并使基础容器的类型成为模板参数。虽然这是一个学校项目,可能会有太多的灵活性。您可以从使用现有Container之一的合成开始,并在必要时从那里构建。