priority_queue如何自定义比较函数
时间: 2023-11-19 09:57:14 浏览: 123
要自定义比较函数,可以使用函数对象(Functor)或者Lambda表达式。以下是两种方法的示例代码:
使用函数对象:
```c++
struct MyCompare {
bool operator()(const int& a, const int& b) {
return a > b; // 以降序方式排序
}
};
priority_queue<int, vector<int>, MyCompare> pq;```
使用Lambda表达式:
```c++
auto cmp = [](const int& a, const int& b) {
return a > b; // 以降序方式排序
};
priority_queue<int, vector<int>, decltype(cmp)> pq(cmp);
```
在以上两种方法中,都是定义了一个比较函数对象,然后将其作为第三个参数传递给priority_queue。注意,函数对象的operator()必须是const的。
相关问题
priority_queue 自定义比较函数
priority_queue 是C++标准库中的一个容器适配器,它提供了一种基于优先级的元素访问方式。默认情况下,priority_queue 使用 std::less 作为比较函数,即元素按照从大到小的顺序排列。但是,我们也可以通过自定义比较函数来改变元素的排序规则。
自定义比较函数需要满足严格弱序关系,即对于任意的元素 a 和 b,比较函数返回 true 表示 a 在 b 前面。在自定义比较函数时,我们可以使用函数指针、函数对象或者 lambda 表达式。
下面是一个使用自定义比较函数的示例,假设我们要按照元素的绝对值大小进行排序:
```cpp
#include <iostream>
#include <queue>
#include <functional>
struct Compare {
bool operator()(int a, int b) {
return abs(a) > abs(b);
}
};
int main() {
std::priority_queue<int, std::vector<int>, Compare> pq;
pq.push(3);
pq.push(-1);
pq.push(5);
pq.push(-2);
while (!pq.empty()) {
std::cout << pq.top() << " ";
pq.pop();
}
return 0;
}
```
在上述示例中,我们定义了一个名为 Compare 的结构体,并重载了函数调用运算符。在函数调用运算符中,我们使用 abs 函数来比较元素的绝对值大小,返回结果为 true 表示第一个元素的绝对值大于第二个元素的绝对值。然后,我们将 Compare 作为第三个模板参数传递给 priority_queue,以指定使用自定义的比较函数。
priority_queue 自定义比较
priority_queue 的自定义比较可以通过重载小于操作符或者自定义函数对象来实现。
通过重载小于操作符,可以定义一个结构体或者类,并在其中重载小于操作符来比较元素的优先级。比如,可以定义一个结构体 MyType,重载小于操作符,使得元素按照 val 从大到小排序。
```
struct MyType {
int val;
bool operator<(const MyType& other) const {
return val > other.val; // 从大到小排序
}
};
priority_queue<MyType> pq;
```
另一种方法是通过定义函数对象来实现自定义比较。可以创建一个结构体或类,并在其中重载()操作符,然后作为模板参数传递给 priority_queue。比如,可以定义一个类 cmp,重载了()操作符,使得小的元素在队尾,优先级越低。
```
struct cmp {
bool operator()(int a,int b){
return a < b; // 小的放左边,即less
}
};
priority_queue<int,vector<int>,cmp> pq;
```
还可以使用函数指针来自定义比较。可以定义一个函数,接受两个参数,并返回一个 bool 值,表示第一个元素是否比第二个元素优先。然后将函数指针作为模板参数传递给 priority_queue。例如,可以定义一个函数对象 cmp,重载了()操作符,使得大的元素在队尾,优先级越低。
```
bool cmp(int a, int b) {
return a > b; // 大的放左边,即greater
}
priority_queue<int, vector<int>, bool (*)(int, int)> pq(cmp);
```
以上是三种常见的自定义比较方法,可以根据实际需求选择其中一种来实现自定义比较。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [优先队列之自定义比较函数](https://blog.csdn.net/yrk0556/article/details/87994924)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *2* [c++优先队列priority_queue(自定义比较函数)](https://blog.csdn.net/qq_21539375/article/details/122128445)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *3* [一文看懂priority_queue自定义比较函数有几种方法](https://blog.csdn.net/weixin_36389889/article/details/129802998)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
[ .reference_list ]
阅读全文