stl c++优先级队列可以与stl集一起使用吗

Can the stl c++ priority queue be used with stl set?

本文关键字:stl 一起 c++ 优先级 队列      更新时间:2023-10-16

我的问题与是否有一个也是Set的Queue(PriorityQueue)实现相同?除了这个是关于c++和stl的。

是否可以使用将stl设置为容器类的stl优先级队列?如果没有,是否有一个替代容器类可以用于优先级队列,使其成为一个集合?

std::priority_queue的规范不允许"唯一成员身份"。如果您希望优先级队列中具有唯一成员身份,则您不希望std::priority_queue

如果您想要一个具有唯一成员身份的优先级队列实现,那么std::set已经这样做了,因为它会按排序顺序保留其成员。

这可能不是最有效的实现,但您可以这样做。(注意,我不想在这里满足std::priority_queue的确切接口,也不想更改比较运算符、底层容器或std::set分配器)。

这个实现只是假装推送成功,而不是在推送重复时抛出。

template<class T>
class UniquePriorityQueue
{
public:
    typedef typename std::priority_queue<T>::size_type size_type;
    void push(const T& v)
    {
        auto i = membership_.insert(v);
        if(i.second)
        {
            queue_.push(v);
        }
    }
    void pop(void)
    {
        membership_.erase(queue_.top());
        queue_.pop();
    }
    const T& top() const
    {
        return queue_.top();
    }
    bool empty() const
    {
        return queue_.empty();
    }
    size_type size() const 
    {
        return queue_.size();
    }
private:
    std::priority_queue<T> queue_;
    std::set<T> membership_;
};

一个驱动所实现功能的main。。。

int main()
{
    UniquePriorityQueue<int> q;
    q.push(1);
    q.push(1);
    q.push(8);
    q.push(4);
    q.push(2);
    q.push(8);
    q.push(5);
    q.push(7);
    assert(q.size() == 6);
    assert(q.top() == 8);
    q.pop();
    assert(q.top() == 7);
    q.pop();
    assert(q.top() == 5);
    q.pop();
    assert(q.top() == 4);
    q.pop();
    assert(q.top() == 2);
    q.pop();
    assert(q.top() == 1);
    q.pop();
    assert(q.empty());  
}