文章目录

格式

Lambda表达式完整的声明格式如下:

[capture list] (params list) mutable exception-> return type { function body }

各项具体含义如下

capture list:捕获外部变量列表
params list:形参列表
mutable指示符:用来说用是否可以修改捕获的变量
exception:异常设定
return type:返回类型
function body:函数体

应用

该代码测试按照元音排序string类型的vector.它把sort函数的第三个比较函数,直接写在参数这个位置了。
capture里的内容是做捕获外部的变量,这个变量可以当作该函数的全局变量使用。()内的内容还是要当作参数列表来使用。

// Author: Hayden
#include <string>
#include <vector>

#include "catch2/catch.hpp"
#include "range/v3/utility.hpp"

// There definitely may be better ways to do this...

TEST_CASE("Checks sort3(int&, int&, int&)") {
std::vector<std::string> vec{"We", "love", "lambda", "functions"};
// vowels是一个匿名函数
auto const vowels = [] (char const& c) { return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'; };
// 在sort这个位置,同样设置了一个没有名字的匿名函数,它捕获的参数是vowels这个匿名函数,接收两个参数比大小。其实就是sort函数比较大小,需要两个参数。把以前写在外面的compare函数写成匿名函数了。
std::sort(vec.begin(), vec.end(), [vowels] (std::string const& x, std::string const& y) {
auto const xcount = std::count_if(x.cbegin(), x.cend(), vowels);
auto const ycount = std::count_if(y.cbegin(), y.cend(), vowels);
if (xcount == ycount) {
return (x.length() - static_cast<std::string::size_type>(xcount)) > (y.length() - static_cast<std::string::size_type>(ycount));
}
return xcount > ycount;
});

std::vector<std::string> correct_order{"functions", "lambda", "love", "We"};
CHECK(correct_order == vec);
}

std::countif

判断从开始到结尾有多少满足条件的,计数

static_cast

static_cast, 用于良性转换,一般不会导致意外发生,风险很低。编译时转换
​​​ https://www.geeksforgeeks.org/static_cast-in-c-type-casting-operators/​

参考链接

​匿名函数​