C++ 实现可在C+中迭代的优先级队列+;
我需要为一个项目实现一个优先级队列,但是STL的C++ 实现可在C+中迭代的优先级队列+;,c++,priority-queue,C++,Priority Queue,我需要为一个项目实现一个优先级队列,但是STL的priority\u queue没有被指示,因为我们需要迭代所有元素并随机删除它们 我们正在考虑为此使用STL的集,将其包装在一个类中,使其成为ADT 有没有更聪明的解决方案 我们如何才能使set的一些公共成员函数可以公开使用?我们对迭代器等感兴趣 显然,由于缺乏虚拟析构函数,推导STL是不明智的:/ 新代码: #ifndef PRIORITYQUEUE_H_ #define PRIORITYQUEUE_H_ #include <set&
priority\u queue
没有被指示,因为我们需要迭代所有元素并随机删除它们
我们正在考虑为此使用STL的集
,将其包装在一个类中,使其成为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_ */
\ifndef PRIORITYQUEUE\u H_
#定义优先级队列_
#包括
模板
类优先级队列{
typedef impl_type set_type;
typedef typename set_type::迭代器迭代器;
公众:
无效推送(常数T&x){
插入(x);
}
void pop(){
擦除(begin());
}
常量T&top()常量{
返回*begin();
}
};
#endif/*优先级队列*/
所以我们现在有这个。编译器不会抱怨insert,但会抱怨erase(begin())
和return*begin()
:
没有依赖于模板参数的'begin'参数,因此'begin'声明必须可用
这是为什么?您真的需要优先级队列吗 您需要迭代所有项目并随机删除->链表
如果您需要对列表进行排序,请在开始时对其进行排序,然后在插入新项时使用插入排序(在正确的位置插入新项)。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
};
模板类优先队列{
typedef impl_type set_type;
typedef typename set_type::迭代器迭代器;
//等
公众:
//转发集合的成员
T&top(){
返回*begin();
}
//等
};
我将遵循标准库use composition中其他一些容器适配器设置的示例,并将底层容器的类型作为模板参数。但由于这是一个学校项目,可能会有太多的灵活性。您可以从对现有容器之一使用组合开始,并在必要时从那里构建 您应该能够使用std::vector
、std::make_heap
、std::push_heap
和std::pop_heap
实现自己的优先级队列。这不是std::priority\u queue
的实现方式吗?删除随机元素时,只需再次调用std::make_heap
,即可修复数据结构
您需要按顺序迭代元素吗?有一个
std::sort\u heap
算法来对底层std::vector
进行排序,您应该将线程标记为作业。这是一个更大项目的一小部分。当然,我不需要密码回答。ADT?代数数据类型?请检查更新的问题,返回了一些错误。@Francisco:那是因为您没有转发集合的成员,就像我在评论中写的。然后我不理解转发的概念。@Francisco:您在prio_队列中实现了set的所有成员函数,这些函数只是转发到set的实现。make_heap和std::priority_队列可能是正确的选择,也可能不是,因为它们不能保证稳定性(注意:排序顺序稳定性而非崩溃稳定性。)