stl c++优先级队列可以与stl集一起使用吗
Can the stl c++ priority queue be used with stl set?
我的问题与是否有一个也是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());
}
相关文章:
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 在C应用程序中运行C++(带有STL)函数
- 如何将 stl 迭代器与特征一起使用?
- 将 STL 容器与结构一起使用
- 自定义分配器有时会与stl向量一起崩溃
- stl c++优先级队列可以与stl集一起使用吗
- 将"using namespace boost::numeric::ublas;"与 stl 矢量一起使用时出错
- 将我的自定义迭代器与 STL 算法一起使用
- 哪些 STL 算法可以安全地与单通道输入迭代器一起使用
- 将extern模板类与STL类一起使用
- 将STL容器与提升范围适配器一起使用时出现value_type错误
- c++STL算法remove_if与模板一起使用
- STL算法可以与循环列表一起使用吗?
- 为什么scoped_ptr不能与 STL 容器一起使用?
- 是否可以将STL复制功能与地图一起使用
- 如何将策略模式与 STL 容器一起使用