priority_queue 使用

本文详细介绍了优先队列的三种实现方法:标准库默认使用元素类型的<操作符、使用functional.h函数对象作为比较函数、自定义优先级。通过示例展示了如何将元素从小到大或从大到小输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

priority_queue

在优先队列中,优先级高的元素先出队列。
标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。
优先队列的第一种用法,也是最常用的用法:

priority_queue < int >  qi;

通过<操作符可知在整数中元素大的优先级高。
故示例1中输出结果为:9 6 5 3 2

第二种方法:
在示例1中,如果我们要把元素从小到大输出怎么办呢?
这时我们可以传入一个比较函数,使用functional.h函数对象作为比较函数。

priority_queue < int , vector < int > , greater < int >   > qi2;

其中
第二个参数为容器类型。
第二个参数为比较函数。
故示例2中输出结果为:2 3 5 6 9

第三种方法:
自定义优先级。

struct node
{
    
friend  bool operator <  (node n1, node n2)
    {
        
return  n1.priority  <  n2.priority;
    }
    
int  priority;
    
int  value;
};

在该结构中,value为值,priority为优先级。
通过自定义operator<操作符来比较元素中的优先级。
在示例3中输出结果为:
优先级  值
9          5
8          2
6          1
2          3
1          4
但如果结构定义如下:

struct node
{
    
friend  bool operator >  (node n1, node n2)
    {
        
return  n1.priority  >  n2.priority;
    }
    
int  priority;
    
int  value;
};

则会编译不过(G++编译器)
因为标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。
而且自定义类型的<操作符与>操作符并无直接联系,故会编译不过。

//代码清单

 

#include<iostream>
#include
<functional>
#include
<queue>
using 
Namespace stdnamespace std;
struct node
{
    
friend bool operator< (node n1, node n2)
    {
        
return n1.priority < n2.priority;
    }
    
int priority;
    
int value;
};
int main()
{
    
const int len = 5;
    
int i;
    
int a[len= {3,5,9,6,2};
    
//示例1
    priority_queue
<int> qi;
    
for(i = 0; i < len; i++)
        qi.push(a[i]);
    
for(i = 0; i < len; i++)
    {
        cout
<<qi.top()<<" ";
        qi.pop();
    }
    cout
<<endl;
    
//示例2
    priority_queue
<int, vector<int>, greater<int> >qi2;
    
for(i = 0; i < len; i++)
        qi2.push(a[i]);
    
for(i = 0; i < len; i++)
    {
        cout
<<qi2.top()<<" ";
        qi2.pop();
    }
    cout
<<endl;
    
//示例3
    priority_queue
<node> qn;
    node b[
len];
    b[
0].priority = 6; b[0].value = 1
    b[
1].priority = 9; b[1].value = 5
    b[
2].priority = 2; b[2].value = 3
    b[
3].priority = 8; b[3].value = 2
    b[
4].priority = 1; b[4].value = 4

    
for(i = 0; i < len; i++)
        qn.push(b[i]);
    cout
<<"优先级"<<'\t'<<"值"<<endl;
    for(i = 0; i < len; i++)
    {
        cout
<<qn.top().priority<<'\t'<<qn.top().value<<endl;
        qn.pop();
    }
    
return 0;
}

转自:http://www.cnblogs.com/vvilp/articles/1504436.html

 

 

make_heap使用


在C++中,`priority_queue` 是一种容器适配器,用于实现优先队列。它的第一个元素总是当前包含的元素中最大的(默认情况下),这使得它非常适合需要快速访问最大元素的场景[^4]。 ### 基本用法 `priority_queue` 的模板类型定义如下: ```cpp template <typename T, typename Container=std::vector<T>, typename Compare=std::less<T>> class priority_queue; ``` 这意味着 `priority_queue` 需要三个模板参数: - `T`:存储在队列中的元素类型。 - `Container`:用于存储数据的底层容器,默认为 `std::vector<T>`。 - `Functional`:比较函数或对象,用于确定元素的排序规则,默认为 `std::less<T>`,即构建大根堆[^2]。 ### 创建和初始化 创建一个简单的 `priority_queue` 实例非常直接。下面的例子展示了如何声明一个整数类型的优先队列,并向其中添加一些元素: ```cpp #include <iostream> #include <queue> int main() { std::priority_queue<int> pq; // 向优先队列中添加元素 pq.push(10); pq.push(30); pq.push(20); // 输出队列顶部元素,即最大的元素 std::cout << "Top element: " << pq.top() << std::endl; // 输出30 // 移除顶部元素 pq.pop(); // 再次输出顶部元素 std::cout << "New top element: " << pq.top() << std::endl; // 输出20 return 0; } ``` ### 自定义比较器 如果需要创建一个小根堆而不是默认的大根堆,可以通过提供自定义的比较器来实现。例如,使用 `std::greater<T>` 比较器可以轻松地创建一个小根堆: ```cpp #include <iostream> #include <queue> #include <functional> // std::greater int main() { // 使用 std::greater<int> 创建小根堆 std::priority_queue<int, std::vector<int>, std::greater<int>> minPQ; minPQ.push(10); minPQ.push(30); minPQ.push(20); // 输出最小的元素 std::cout << "Minimum element: " << minPQ.top() << std::endl; // 输出10 return 0; } ``` ### 注意事项 - `priority_queue` 不支持迭代器,因此不能直接遍历队列中的所有元素。 - 插入和删除操作的时间复杂度接近于对数时间,即 O(log n)。 - 底层容器的选择会影响性能,通常推荐使用 `std::vector` 或 `std::deque`,因为它们提供了良好的随机访问特性[^3]。 通过上述介绍和示例,应该能够开始在自己的项目中使用 `priority_queue` 来处理需要优先级管理的数据了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值