携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情
优先队列的简单用法
优先队列priority_queue第三个类模板参数,可以借助lambda表达式实现。所谓的lambda表达式,其实就是一个匿名函数。所谓的匿名是相对于具名(也就是“有名字”)而言的。一般来说,在C++里,一个函数是包含声明与定义两部分的,在声明和定义中,都会给函数起一个名字,而lambda表达式则没有。一个典型的lambda表达式是这样的:
auto f = [=](int a)->int{return 0;};
这里就是将一个lambda表达式赋值给变量f,其中f的类型使用auto关键字进行自动推导。
[]代表的是“捕获”(capture)。“捕获”的意思可以理解为将lambda表达式这个作用域以外的变量也纳入到作用域内。这里的捕获类型有非常多,主要涉及复制和引用两种捕获,其他捕获就是在这两种基础类型上进行的拓展。复制用=表示,引用用&表示。如果不在[]中写任何内容就是不捕获任何变量。也可以使用[=,&x]来表示除对变量x采用引用捕获外,其他变量均采用复制捕获。不太一样的是,如果对某个变量进行复制捕获,变量名前面无需加=,例如[x]就代表只以复制捕获的方式捕获变量x,[&,x]就代表除了以复制捕获的方式捕获变量x之外,对其他变量均以引用捕获的方式进行捕获。特别地,因为每个类都缺省带一个this指针,所以也可以单独指定this进行捕获。
()就是和普通具名函数一样的作用,用来填写函数的传入参数的类型以及名称。
->代表的是lambda函数的返回值类型,比如上例中,lambda表示式返回值即为int。
{}和普通具名函数一样,代表着函数体,也就是具体实现部分。