类别:容器,适配器 | 组件类型:类型 |
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.