c++匿名lambda函数(c++11)
原创
©著作权归作者所有:来自51CTO博客作者mb62d4cb3345700的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
格式
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/
参考链接
匿名函数