优先队列
< queue >
template <class T, class Container = vector<T>, class Compare = less<typename Container::value_type> > class priority_queue;
介绍
优先队列是一种容器适配器,它的第一个元素永远是容器中“最大的”元素,所谓“最大”是通过自定义的某个准则(弱排序准则)排出的。
就像堆一样,可以随时插入元素,但是只能获取最大元素(最大堆),就像是优先队列中的第一个元素。
优先队列被实现为容器适配器,它们是使用特定容器类的封装对象作为其底层容器的类,提供了一组特定的成员函数来访问其元素。 从特定容器的“后部”弹出元素,这被称为优先级队列的顶部。
底层容器可以是一种标准模板容器,也可以是专门设计的容器类。它需要可以通过随机访问迭代器来读取元素,并且至少实现以下操作:
empty() size() front() push_back() pop_back()
标准容器类vector和deque满足上述要求,默认使用vector作为底层容器。
支持随机迭代器访问需要在内部一直维持堆结构。这是通过容器适配器在需要时自动的在内部调用make_heap(),pop_heap(),push_heap()来实现的。
模板参数
- T
元素类型,别名priority_queue::value_type - Container
底层的容器类型,默认为vector,其元素类型为T,别名priority_queue::container_type - Compare
一个二元谓词,它使用两个类型为T的参数返回一个bool值。例如,表达式comp(a, b),comp是Compare类型,且a和b是容器中的元素,那么在“弱排序准则”下如果a在b的前面则会返回true。priority_queue使用这个函数来在内部维持堆的性质。(例如,pop会弹出在弱排序准则下的最后一个元素)。它可以是函数指针也可以是函数对象,默认是less,返回值与a<b相同。
成员函数
构造函数
/* 初始化 */
priority_queue(const Compare& comp, const Container& ctnr);
/* 范围 */
template <class InputIterator>
priority_queue(InputIterator first, InputIterator last, const Compare& comp, const Container& ctnr);
/* 举例 */
class mycomparison
{
bool reverse;
public:
mycomparison(const bool& revparam=false)
{reverse=revparam;}
bool operator() (const int& lhs, const int&rhs) const
{
if (reverse) return (lhs>rhs);
else return (lhs<rhs);
}
};
int main ()
{
int myints[]= {10,60,50,20};
std::priority_queue<int> first;
std::priority_queue<int> second (myints,myints+4);
std::priority_queue<int, std::vector<int>, std::greater<int> >
third (myints,myints+4);
// using mycomparison:
typedef std::priority_queue<int,std::vector<int>,mycomparison> mypq_type;
mypq_type fourth; // less-than comparison
mypq_type fifth (mycomparison(true)); // greater-than comparison
return 0;
}
其它
empty()
size()
top() // 顶部元素,弱排序准则下最后一个元素,即“最大的”元素
push()
pop() // 弹出顶部元素
emplace()
swap()