| 类别:容器,适配器 | 组件类型:类型 |
Priority_queue是一个容器适配器,这意味着它是在底层容器类型的基础上实现的。默认情况下,底层类型为vector,但可以显式选择不同的类型。
int main() {
priority_queue<int> Q;
Q.push(1);
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());
}
| 参数 | 说明 | 默认 |
|---|---|---|
| T | 存储在优先队列中的对象的类型。 | |
| Sequence | 用于实现优先队列的底层容器的类型。 | vector<T> |
| Compare | 用于确定一个元素是否小于另一个元素的比较函数。如果Compare(x,y)是true,则x小于y。由Q.top()返回的元素是优先队列中的最大元素。也就是说,它具有如下属性:对于优先队列中的每个其他元素,xCompare(Q.top(), x)是false. | less<T> |
| 成员 | 定义位置 | 说明 |
|---|---|---|
| value_type | priority_queue | 见下文。 |
| size_type | priority_queue | 见下文。 |
| priority_queue() | Default Constructible | 默认构造函数。创建一个空priority_queue,使用Compare()作为比较函数。 |
| priority_queue(const priority_queue&) | Assignable | 复制构造函数。 |
| priority_queue(const Compare&) | priority_queue | 见下文。 |
priority_queue(const value_type*,
const value_type*)
|
priority_queue | 见下文。 |
priority_queue(const value_type*,
const value_type*,
const Compare&)
|
priority_queue | 见下文。 |
priority_queue& operator=(const priority_queue&) |
Assignable | 赋值运算符。 |
| bool empty() const | priority_queue | 见下文。 |
| size_type size() const | priority_queue | 见下文。 |
| const value_type& top() const | priority_queue | 见下文。 |
| void push(const value_type&) | priority_queue | 见下文。 |
| void pop() [3] | priority_queue | 见下文。 |
| 成员 | 说明 |
|---|---|
| value_type | 存储在priority_queue中的对象类型。这与以下内容相同T和Sequence::value_type. |
| size_type | 无符号整数类型。这与以下内容相同Sequence::size_type. |
| priority_queue(const Compare& comp) | 构造函数。创建空的priority_queue,使用comp作为比较函数。默认构造函数使用Compare()作为比较函数。 |
priority_queue(const value_type* first,
const value_type* last)
|
构造函数。创建一个priority_queue初始化为包含[first, last)中的元素,并使用Compare()作为比较函数。 |
priority_queue(const value_type* first,
const value_type* last,
const Compare& comp)
|
构造函数。创建一个priority_queue初始化为包含[first, last)中的元素,并使用comp作为比较函数。 |
| bool empty() const | 返回true如果priority_queue不包含任何元素且false否则。S.empty()等效于S.size() == 0. |
| size_type size() const | 返回包含在priority_queue. |
| const value_type& top() const | 中的元素数Compare返回对 priority_queue 顶部元素的常量引用。保证顶部元素是 priority_queue 中最大的元素,由比较函数x确定。这意味着,对于priority_queue, Compare(Q.top(), x)是false中的其他任何元素。前提是false. |
| empty() | void push(const value_type& x)x插入到 priority_queue 中。后置条件size()1. |
| void pop() | 将增加。前提是false。从 priority_queue 中移除顶部的元素,即 priority_queue 中最大的元素。 [3] 前提到 priority_queue 中。后置条件。后置条件1. |
备注
[1] 优先级队列是一个标准概念,可以用许多不同的方式实现;此实现使用堆。在所有算法书中都有关于优先级队列的讨论;例如,参见 Knuth 的第 5.2.3 节。(D. E. Knuth,计算机编程的艺术。第 3 卷:排序和搜索。阿迪森 - 韦斯利,1975。)priority_queue[2] 这种限制是vector存在的唯一原因。如果通过元素的迭代很重要,则可以使用以排序好的顺序维护,或者setvector,或者使用, make_heappush_heap和. Priority_queuepop_heappriority_queue作为堆维护的
事实上,被实现为作为堆维护的随机访问容器。使用容器适配器的唯一原因是,而不是手动执行堆操作,是为了明确表示你永远不会执行任何可能违反堆不变性的操作。[3] 可能有人会疑惑为什么pop()返回value_typevoid而不是和的唯一原因是,而不是手动执行堆操作,是为了明确表示你永远不会执行任何可能违反堆不变性的操作。。即,为什么必须使用priority_queuetop()的唯一原因是,而不是手动执行堆操作,是为了明确表示你永远不会执行任何可能违反堆不变性的操作。返回栈顶元素,它将通过值返回而不是通过引用返回:通过引用返回将创建一个悬空指针。但是,通过值返回效率低下:它至少要调用一个冗余的复制构造函数。由于不能的唯一原因是,而不是手动执行堆操作,是为了明确表示你永远不会执行任何可能违反堆不变性的操作。用既高效又正确的方式返回一个值,因此它不返回任何值并且要求客户端使用而不是来检查priority_queue.