我需要为项目实现优先级队列,但是未指示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
为什么会这样?
答案 0 :(得分:3)
您应该能够使用std::vector
,std::make_heap
,std::push_heap
和std::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之一的合成开始,并在必要时从那里构建。