我的问题与Is there a Queue (PriorityQueue) implementation which is also a Set?相同,只不过这个问题与c ++和stl有关。
是否可以使用stl优先级队列和stl set作为容器类?如果没有,是否有一个替代容器类,我可以使用优先级队列来使它成为一个集合?
答案 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());
}