优先队列用法(转载)
在优先队列中,优先级高的元素先出队列。
标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。
优先队列的第一种用法,也是最常用的用法:![]()
1priority_queue<
int
> qi;
通过<操作符可知在整数中元素大的优先级高。
故示例1中输出结果为:9 6 5 3 2
第二种方法:
在示例1中,如果我们要把元素从小到大输出怎么办呢?
这时我们可以传入一个比较函数,使用functional.h函数对象作为比较函数。
1priority_queue<
int
, vector<
int
>, greater<
int
> >qi2;
其中
第二个参数为容器类型。
第二个参数为比较函数。
故示例2中输出结果为:2 3 5 6 9
第三种方法:
自定义优先级。![]()
123456789struct
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
但如果结构定义如下:
123456789struct
node
{
friend
bool
operator
> (node n1, node n2)
{
return
n1.priority > n2.priority;
}
int
priority;
int
value;
};
则会编译不过(G++编译器)
因为标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。
而且自定义类型的<操作符与>操作符并无直接联系,故会编译不过。
//代码清单
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657#include<iostream>
#include<functional>
#include<queue>
using
namespace
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.cppblog.com/shyli/archive/2007/04/06/21366.html
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法