C++中有 五种可调用对象:
1. 函数
2. 函数指针
3. lambda表达式
4. 重载了函数调用运算符的类
5. bind创建的对象
函数不能定义在另一个函数内, 但是 lambda表达式可以定义在函数内。
一.什么是 lambda表达式一个lambda表达式 表示一个可调用的代码单元,可理解为 一个未命名的内联函数。一个lambda表达式具有一个返回类型、一个参数列表 和 一个函数体。表达式形式如下:
[capture list ] ( parameter list) -> return type { function body }
capture list : 捕获列表, 一个lambda 所在函数中定义的局部变量的列表,通常为空
return type : 返回类型
parameter list:参数列表
function body: 函数体
lambda 必须使用 尾置返回 来指定返回类型。 如果 忽略返回类型,lambda根据函数体中的代码推断出返回类型。
例如:
auto compare = [](const int a, const int b){ return a > b;}
二、lambda的调用
调用方式与普通函数的调用方式相同,都是使用调用运算符() :
1.不使用捕获列表示例1:
#include#include #include #include using namespace std; int main() { auto compare = [](const int a, const int b) {return a > b; }; cout << "3 与 7的对比结果:"< 运行结果是:
示例2:
sort函数,默认是从小到大排序,自定义按照string的大小进行排序
#include#include #include #include using namespace std; int main() { vector mystring = {"a","egg","elephant","piggy","monkey","yellow","ahelkh","walawalawala"}; sort(mystring.begin(), mystring.end(), [](const string a, const string b) {return a.size() > b.size(); }); cout << "sort排序后的结果是:"; for (auto mem:mystring) { cout << " " << mem; } cout << endl; system("pause"); return 0; } 运行结果:
2.使用捕获列表lambda以一对 [ ] 开始,可以在其中提供一个以逗号分隔的名字列表 , 这些名字都是 它所在函数中定义的。
示例1:
#include#include #include #include using namespace std; int main() { //使用捕获列表 // string a = "hlloy high"; string b = "what?"; auto compare= [a,b](const string c) { return c.size() > a.size() && c.size() >b.size(); }; cout << compare("WoWwwww you get one goald") << endl; system("pause"); return 0; } 运行结果是:
示例2:
#include#include #include #include using namespace std; int main() { vector mystring = {"a","egg","elephant","piggy","monkey","yellow","ahelkh","walawalawala"}; //找到第一个大于6的字符串 int sz = 6; auto wx = find_if(mystring.begin(), mystring.end(), [sz](const string a) {return a.size() > sz; }); cout <<"第一个大于 sz 大小的字符串是:"<< *wx << endl; system("pause"); return 0; } 执行结果是:



