C++标准模板库(STL)中的优先队列

C++标准模板库(STL)中的优先队列

作为C++中最有用且最具表现力的一种数据结构之一,优先队列在STL中得到了广泛的应用。它能够以O(log n)的时间实现元素的插入和删除,并且可以实现高效的堆排序。在本篇文章中,我们将深入学习STL优先队列的使用方法。

什么是优先队列?

优先队列(Priority Queue)是一种特殊的队列,它可以保证每次取出的元素都是队列中的最大值或最小值。优先队列通常用堆来实现,在C++中,STL提供了相关的函数和类来实现优先队列。

在STL中,优先队列是基于类模板priority_queue<T,Container,Compare>实现的。其中,T表示存储在优先队列中的元素的类型,Container表示作为底层容器的类型,而Compare表示比较器类型。

优先队列的常用函数

STL中优先队列有以下常用的函数:

push()

向优先队列中加入一个元素,这个元素会被自动放到正确的位置上。

#include <iostream>
#include <queue>

using namespace std;

int main()
{
    priority_queue<int> pq;
    pq.push(1);
    pq.push(3);
    pq.push(2);
    while (!pq.empty()) {
        cout << pq.top() << " ";
        pq.pop();
    }
    return 0;
}

输出结果:3 2 1

pop()

从优先队列中删除优先级最高的元素。

#include <iostream>
#include <queue>

using namespace std;

int main()
{
    priority_queue<int> pq;
    pq.push(1);
    pq.push(3);
    pq.push(2);
    while (!pq.empty()) {
        cout << pq.top() << " ";
        pq.pop();
    }
    return 0;
}

输出结果:3 2 1

top()

获取优先队列中优先级最高的元素的值。

#include <iostream>
#include <queue>

using namespace std;

int main()
{
    priority_queue<int> pq;
    pq.push(1);
    pq.push(3);
    pq.push(2);
    cout << "The top element is " << pq.top() << endl;
    return 0;
}

输出结果:The top element is 3

size()

获取优先队列中元素的数量。

#include <iostream>
#include <queue>

using namespace std;

int main()
{
    priority_queue<int> pq;
    pq.push(1);
    pq.push(3);
    pq.push(2);
    cout << "The size is " << pq.size() << endl;
    return 0;
}

输出结果:The size is 3

empty()

判断优先队列是否为空。

#include <iostream>
#include <queue>

using namespace std;

int main()
{
    priority_queue<int> pq;
    if (pq.empty()) {
        cout << "The queue is empty" << endl;
    } else {
        cout << "The queue is not empty" << endl;
    }
    return 0;
}

输出结果:The queue is empty

STL优先队列的比较器

在STL中,比较器是一个可选的模板参数,它用于对元素进行排序。当不提供比较器时,默认使用小于操作符compare作为比较器。如果我们需要自定义比较器,则需要为其指定一个类或者函数,并将其作为priority_queue的第三个参数。

使用默认比较器

#include <iostream>
#include <queue>

using namespace std;

int main()
{
    priority_queue<int> pq;
    pq.push(1);
    pq.push(3);
    pq.push(2);
    while (!pq.empty()) {
        cout << pq.top() << " ";
        pq.pop();
    }
    return 0;
}

输出结果:3 2 1

自定义比较器

#include<iostream>
#include <queue>
#include <functional>

using namespace std;

struct MyCompare
{
    bool operator()(const int& a, const int& b) const
    {
        return a > b;
    }
};

int main()
{
    priority_queue<int, vector<int>, MyCompare> pq;
    pq.push(1);
    pq.push(3);
    pq.push(2);
    while (!pq.empty()) {
        cout << pq.top() << " ";
        pq.pop();
    }
    return 0;
}

输出结果:1 2 3

在上面的代码中,我们自定义了MyCompare比较器,并通过第三个参数将其传递给了priority_queue。我们重载了()操作符来实现我们自己的比较逻辑,这里我们采用了一个大根堆的形式。

结论

在STL中,优先队列是一个非常有用的数据结构,它是通过堆来实现的,并可以在O(log n)的时间内进行插入和删除操作。STL提供了相应的函数和类来实现优先队列。同时,我们也可以自定义比较器来实现对元素的自定义排序。熟练掌握优先队列的使用,可以提高我们程序的运行效率和方便性。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 教程