C++中集合的优先队列及示例

C++中集合的优先队列及示例

C++编程中,集合是一种常见的数据结构。而在集合的处理过程中,优先队列则是其中的一种经典应用。本文将介绍C++中集合的优先队列及示例。

什么是优先队列?

优先队列(Priority Queue)是一种特别的线性结构,它维护了一个元素集合,每个元素都有一个关键字。相对于普通的队列,优先队列中元素的插入和取出不仅考虑到时间的先后,还考虑到元素的关键字,优先队列可以保证最高优先级的元素先被取出。

在C++中,优先队列实现方式是通过堆(Heap)来实现,具体的实现方法在后续代码示例中会详细介绍。

C++中优先队列的定义和基本操作

C++中使用STL库中的queue头文件来实现队列操作。但STL库中queue的实现是先进先出的队列(FIFO),而不是优先队列。因此,我们需要使用priority_queue来实现优先队列。

定义优先队列

C++中定义优先队列的语法如下:

priority_queue<元素类型, 容器类型, 比较函数> pq;

其中,元素类型表示队列中元素的类型;容器类型表示队列使用的容器,默认是使用vector;比较函数表示用来判断元素谁更大(优先级更高)的一个函数,可以用户自定义,如果用户没有自定义则默认的比较方法是”小于”( <)。

基本操作

下表列出了C++ STL中priority_queue支持的主要操作。

操作 描述
push() 向优先队列中添加一个元素
pop() 从优先队列中取出一定是最大的元素,并将其删除
top() 获取优先队列中最大的元素,但不删除它
empty() 如果队列为空返回 true,否则返回 false
size() 返回队列中元素的个数

C++中的优先队列示例

下面我们通过一些C++实例来说明如何在优先队列中使用C++ STL库。

示例一:使用默认比较器的优先队列

下面我们来看一个简单的示例来创建一个优先队列,用默认的比较函数。我们首先需要包含头文件,如下所示:

#include<bits/stdc++.h>
using namespace std;

我们通过以下代码创建了一个队列,在之后我们用push()方法加入一些元素。

priority_queue<int> pq;
pq.push(7);
pq.push(2);
pq.push(5);
pq.push(1);

我们可以通过top()方法来获取优先队列中的最大值,通过pop()方法来弹出值。

cout << "pq中的最大值:" << pq.top() << endl;
pq.pop();
cout << "取出元素后pq中的最大值:" << pq.top() << endl;

输出结果为:

pq中的最大值:7
取出元素后pq中的最大值:5

示例二:使用自定义比较器的优先队列

在有些情况下,我们可能希望将优先队列的排序方式更改为我们自定义的排序方式。这时我们需要自定义一个比较函数,然后将其作为 priority_queue 的第三个参数传递。

例如,我们想按照元素从大到小的顺序来排列,可以定义一个自定义比较函数:

struct mycomparison {
    bool operator() (const int& a, const int& b) const {
            return a < b;
    }
};

接下来,我们创建一个自定义比较函数的优先队列。

priority_queue<int, vector<int>, mycomparison> pq2;
pq2.push(7);
pq2.push(2);
pq2.push(5);
pq2.push(1);

同样,我们可以通过top()方法来获取优先队列中的最大值,通过pop()方法来弹出值。

cout << "pq2中的最大值:" << pq2.top() << endl;
pq2.pop();
cout << "取出元素后pq2中的最大值:" << pq2.top() << endl;

输出结果为:

pq2中的最大值:1
取出元素后pq2中的最大值:2

值得注意的是,在这个例子中,我们传递了一个自定义比较函数 mycomparison 作为 priority_queue 的第三个参数。这个函数中的 operator() 函数返回一个布尔值,表示两个数字哪一个更大。根据这个函数,我们的优先队列会按照从小到大的顺序排列。

总结

本文简单介绍了C++中优先队列的定义,基本操作以及对优先队列进行自定义排序的方法,并通过示例代码展示了优先队列的使用方法。优先队列是C++中常用的数据结构之一,在程序开发中可以提高代码的效率和准确性。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 教程