优先队列,在头文件中。

std::priority_queue

template , class Compare = less > class priorityqueue;
Priority queue
Priority queues are a type of container adaptors, specifically designed such that its first element is always the greatest of the elements it contains, according to some _strict weak ordering
criterion.
优先队列是一种容器适配器,根据一些严格的弱排序原则,它的第一个元素总是所有元素中最大的。
This context is similar to a heap, where elements can be inserted at any moment, and only the max heap element can be retrieved (the one at the top in the priority queue).
它和堆(Heap)相似,堆中的元素可以在任意时刻插入,并且只能检索最大堆元素(在优先队列的顶部)。
Priority queues are implemented as container adaptors, which are classes that use an encapsulated object of a specific container class as its underlying container, providing a specific set of member functions to access its elements. Elements are popped from the “back” of the specific container, which is known as the top of the priority queue.
优先队列被作为容器适配器实现,容器适配器是使用特定容器类的封装对象作为其底层容器的类,并提供一组特定的成员方法访问其元素。元素从特定容器的“back”弹出,也就是优先队列的顶部。
The underlying container may be any of the standard container class templates or some other specifically designed container class. The container shall be accessible through random access iterators and support the following operations:
底层容器可以是任何标准容器类模板或者一些其他专门设计的容器类。容器应可通过随机访问迭代器访问并支持以下操作。

  • empty() 判空
  • size() 大小
  • front() 最前面的元素
  • push_back() 后插
  • pop_back() 后出


The standard container classes vector and deque fulfill these requirements. By default, if no container class is specified for a particular priority_queue class instantiation, the standard container vector is used.
标准容器类vector和deque满足这些要求。默认情况下,如果没有为特定的优先队列类实例指定容器类,会使用标准的容器vector。
Support of random access iterators is required to keep a heap structure internally at all times. This is done automatically by the container adaptor by automatically calling the algorithm functions make_heap, push_heap and pop_heap when needed.
为了在内部始终保持堆结构,需要支持随机访问迭代器。这由容器适配器自动完成,通过在需要时调用算法函数make_heap、push_heap和pop_heap。

默认最大堆:priority_queue<int> maxHeap;

定义最小堆:priority_queue<int, vector<int>, greater<int> > minHeap;

定义最大堆:priority_queue<int, vector<int>, less<int> > maxHeap;

emplace:构造并插入元素

  1. template <class... Args> void emplace (Args&&... args);

向优先队列中添加新元素,新元素由传递的参数通过构造器原地构建(在容器管理的内存空间内构建)。
该函数通过调用底层容器的emplace_back成员函数并传递参数,然后通过调用push_heap算法重新调整新元素在容器中的位置。

push:插入元素

  1. void push (const value_type& val);
  2. void push (value_type&& val);

在优先队列中插入使用val初始化的新元素。
该函数通过调用底层容器的push_back成员函数插入新元素,然后调用push_heap算法重新调整新元素在堆中的位置。

pop:移除顶部元素

  1. void pop();

移除优先队列的顶部元素,并使其大小减一。
移除的元素具有最高优先级,在移除之前可以使用priority_queue::top获取堆顶元素。
该成员函数通过调用pop_heap算法保证优先队列的堆属性,然后调用底层容器的pop_back()成员函数移除元素。被移除元素的析构函数会被调用。

size:元素个数

  1. size_type size() const;

返回优先队列中的元素个数。该函数会调用底层容器的成员函数size()。

empty:测试容器是否为空

  1. bool empty() const;

返回优先队列是否是空,也即size是否为0。该函数会调用底层容器的empty()成员函数。

top:顶部元素的常量引用

const_reference top() const;

顶部元素是优先队列中相比来说较高的元素,也是调用priority_queue::pop()函数后容器中移除的元素。
该函数会调用底层容器的front()函数。