2

我的问题与Is there a Queue (PriorityQueue) implementation 相同,它也是一个 Set?除了这个是关于 c++ 和 stl 的。

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

4

2 回答 2

10

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

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

于 2012-09-12T01:52:00.393 回答
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());  
}
于 2012-09-11T21:58:56.967 回答