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

时间:2012-09-11 18:04:34

标签: c++ stl set priority-queue

我的问题与Is there a Queue (PriorityQueue) implementation which is also a Set?相同,只不过这个问题与c ++和stl有关。

是否可以使用stl优先级队列和stl set作为容器类?如果没有,是否有一个替代容器类,我可以使用优先级队列来使它成为一个集合?

2 个答案:

答案 0 :(得分:7)

std::priority_queue的规范不允许“唯一成员资格”。如果您想要优先级队列中的唯一成员资格,那么您不需要std::priority_queue

如果您希望优先级队列实现具有唯一成员身份,那么std::set 已经执行了,因为它会使其成员保持排序顺序。

答案 1 :(得分:1)

这可能不是最有效的实现,但你可以做这样的事情。 (注意,我不是试图在这里遇到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_;
};

驱动已实现功能的主要内容......

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());  
}