0%

C++ 使用带自定义比较函数的优先队列

C++ 使用带自定义比较函数的优先队列

优先队列 priority_queue

介绍

C++中自动保持有序的队列,位于 queue 头文件中,能够以 O(logn) 的复杂度取得 n 个元素中的最小元素,不需要自行实现堆排序。此队列默认为大顶堆,可以通过自定义来实现小顶堆。

基本用法

定义

1
2
3
4
5
queue<int> data; // 储存 int 型的从大到小优先队列

queue<int, vector<int>, less<int>> data; // 储存 int 型的从大到小优先队列的等价写法

queue<int, vector<int>, greater<int>> data; // 储存 int 型的从小到大优先队列

成员函数

参考 https://www.cplusplus.com/reference/queue/priority_queue/

自定义类型时的比较设定

由于 less<> 与 greater<> 仅支持系统自带的类型,这里有两种方法可以支持自定义类型的比较

  • 重载 struct 的 operator <(即重载小于号实现比较,因为内部的排序仅使用小于号比较),来为 less<> 与 greater<> 扩展比较能力
  • 传入自定义的 cmp 函数(更准确的说是重载了()操作符的数据结构,因为此处是使用泛型传入的),来完全自定义比较过程

struct 重载运算符

重载语法

重载小于号例子:

1
2
3
4
5
6
7
8
9
struct node{
int data;
int test;
bool operator < (const node &b) const {
return data < b.data;
}
};

priority_queue<node, vector<node>, greater<node>>

自定义 cmp 函数

当涉及到指针类型时只能通过这种方法

语法

1
2
3
4
5
6
7
struct cmp{
bool operator() (node* a, node* b){
return a->data < b->data;
}
};

priority_queue<node*, vector<node*>, cmp> data;

完整总结例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <queue>
#include <vector>

using namespace std;
struct node{
int data;
int test;
bool operator < (const node &b) const {
return data < b.data;
}

node(int d){data = d;}
};

struct cmp{
bool operator() (node* a, node* b){
return *a < *b;
}
};

int main(){
priority_queue<node*, vector<node*>, cmp> data;
node* new_node;

int input, count;
cin >> count;
for(int i = 0; i < count; i++){
cin >> input;
new_node = new node(input);
data.push(new_node);
}

node* input1;
node* input2;
while(data.size() > 1){
input1 = data.top();
data.pop();
input2 = data.top();
data.pop();
input1->data = input1->data + input2->data;
delete input2;
data.push(input1);
}
cout << data.top()->data << endl;
new_node = data.top();
data.pop();
delete new_node;
return 0;
}

Welcome to my other publishing channels