首页 > 编程语言 >C++中lambda与priority_queue一起使用

C++中lambda与priority_queue一起使用

时间:2024-01-22 17:12:13浏览次数:40  
标签:priority PII C++ queue 使用 lambda

想写这篇博客的原因是在刷力扣的 347. 前 K 个高频元素 一题时,需要使用到优先队列priority_queue,其定义如下:

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;

第三个参数是一个可以自定义的比较类型,其必须满足二元谓词,通常可以使用如下两种方法:

  1. 使用自定义的函数对象
  2. lambda表达式
  3. 使用std::greaterstd::less(这里就不介绍这种方法了)

以题 347. 前 K 个高频元素 为例,我们要建立一个小根堆,那么代码如下:

// 方法一

using PII = pair<int, int>;

// 比较类,重载了括号运算符
struct Comp {
    bool operator()(PII& p1, PII& p2) {
        return p1.second > p2.second;
    }
};

priority_queue<PII, vector<PII>, Comp> pq;

当然,另一种方法就是使用lambda表达式,如下:

// 方法二

using PII = pair<int, int>;
auto comp = [](PII& p1, PII& p2) {
    return p1.second > p2.second;
};
// 注意这里需要使用decltype
priority_queue<PII, vector<PII>, decltype(comp)> pq;

但值得注意的是,方法二需要在C++20下才可使用。这是因为priority_queue的第三个模板形参需要的二元谓词要求可复制构造

lambda表达式即构造闭包(能够捕获作用域中的变量的无名函数对象)。而在C++20之前,闭包类型非可默认构造,闭包类型没有默认构造函数。C++20及之后,如果没有指定捕获,那么闭包类型拥有预置的默认构造函数。

/images/2024-01-22-16-14.png

而在目前,力扣中C++编译器使用的是clang17,支持C++20,故使用lambda表达式是没有问题的。

标签:priority,PII,C++,queue,使用,lambda
From: https://www.cnblogs.com/lagitany/p/17980491

相关文章

  • C++内联函数
    什么是内联函数以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。为什么存在内联函数我们知道,普通的函数需要建立栈帧空间因此,可以利用宏来定义一些小的函数(行数较少的)这样,函数调用的时候......
  • C++U6-03-最短路算法4-floyd算法
    B站复习视频:1、https://www.bilibili.com/video/BV1Fj411d71S/?spm_id_from=333.999.0.02、https://www.bilibili.com/video/BV1RK4y1d7ct?p=1&vd_source=5c960e1ede940bc5cab8ed42c8bdc937学习目标 floyd算法Floyd算法是一种用于找到图中所有节点对之间最短路径的动态规划......
  • 一篇简短的文章把C++左右值关系讲的透透彻彻
     目录前言C++左值和右值二、右值引用二、右值引用 前言对于C++的左值和右值相信很多人都没有一个很透彻的了解,之前我也是不懂的时候查阅了好多文章,但是讲完我还是一头雾水,直到我遇到一篇宝藏文章,讲的左值右值的关系以及Move函数的用法是相当的清楚,文章链接......
  • Queue-Linked List Implementation【1月22日学习笔记】
    点击查看代码//Queue-LinkedListImplementation#include<iostream>usingnamespacestd;structnode{ intdata; node*next;};node*front=NULL;node*rear=NULL;//末指针·,则不用遍历整个链表,constanttimevoidEnqueue(intx){ node*temp=newnode; ......
  • C++类和对象-对象特性(1)
    一.对象的初始化和清理面对对象来源于生活,每一个对象都有初始设置以及对象销毁钱的清理数据的设置二.构造函数和析构函数C++利用上述俩个函数完成对象初始化和清理,这两个函数会被编译器自动调用,完成对象初始化和清理工作,如果我们不提供构造函数和析构函数,编译器会提供(编译器......
  • C++保存数据到txt并导入excel中绘图
    C++运行完成后,有时需要将结果保存在类似txt等的文档中,以便于后续查看或调用。1、保存到txt文件中1#include<fstream>234intmain()5{6doubleDire_angle=45*PI/180;//方向角7doublecenter_x=0.0,center_y=0.0;......
  • 【glibc】glib库队列GQueue介绍
    队列是一种向最后添加条目,从最前删除条目的数据结构,这种数据结构在处理按顺序到达的数据是很有用。glib库提供的队列GQueue是一个双端队列,它的实现基础是双向链表,所以它支持在队列的两端进行添加和删除,也支持很多其它的操作,比如在队列中进行插入和删除,但是我不推荐使用这样的功能......
  • 【OpenVINO】基于 OpenVINO C++ API 部署 RT-DETR 模型
     RT-DETR是在DETR模型基础上进行改进的,一种基于DETR架构的实时端到端检测器,它通过使用一系列新的技术和算法,实现了更高效的训练和推理,在前文我们发表了《基于OpenVINO™PythonAPI部署RT-DETR模型|开发者实战》,在该文章中,我们基于OpenVINO™PythonAPI向大家展示......
  • C++命名空间
    C++关键字认识命名空间先看一个例子定义一个rand变量,然后打印,这是没问题的但是如果我们包含头文件stdlib.h呢?就会出现重定义问题这是为什么呢?因为stdlib里面本来就有一个函数叫rand()所以当包含了头文件之后,链接的时候会发现rand重复定义了--这就是命名冲突问题C......
  • C++U6-03-最短路算法2-bellmon-ford算法
    学习目标贝尔曼福特算法、SPFA 可以用来复习的B站视频:1、https://www.bilibili.com/video/BV1RK4y1d7ct?p=3&vd_source=5c960e1ede940bc5cab8ed42c8bdc9372、https://www.bilibili.com/video/BV18a4y1A7gv/?spm_id_from=333.999.0.0 SPFA算法是 Bellman-Ford算法 的队......