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

C++ 实现可在C+中迭代的优先级队列+;,c++,priority-queue,C++,Priority Queue,我需要为一个项目实现一个优先级队列,但是STL的priority\u queue没有被指示,因为我们需要迭代所有元素并随机删除它们 我们正在考虑为此使用STL的集,将其包装在一个类中,使其成为ADT 有没有更聪明的解决方案 我们如何才能使set的一些公共成员函数可以公开使用?我们对迭代器等感兴趣 显然,由于缺乏虚拟析构函数,推导STL是不明智的:/ 新代码: #ifndef PRIORITYQUEUE_H_ #define PRIORITYQUEUE_H_ #include <set&

我需要为一个项目实现一个优先级队列,但是STL的
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_队列可能是正确的选择,也可能不是,因为它们不能保证稳定性(注意:排序顺序稳定性而非崩溃稳定性。)