C++11匿名函数lambda的使用-创新互联
我最早接触lambda的概念是在matlab中,那时候在做数值模拟的课题,lambda可以快速定义简单的函数,当时觉得好方便。任何语言都有这个功能,下面来看看C++11新引入的lambda是如何使用的吧。
成都创新互联是专业的象州网站建设公司,象州接单;提供网站设计、成都网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行象州网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!目录
一、lambda基础介绍
二、lambda使用例子
2.1 STL算法中的回调函数
2.2 回调函数
2.3 多线程编程
三、总结
官方介绍:
一、lambda基础介绍C++ lambda是C++11新增的一种匿名函数的实现方式,可以在代码中直接定义一个函数对象。它的语法是通过关键字“[]”来定义的,括号里可以包含需要访问的外部变量。Lambda函数可以用于在STL算法中提供自定义的比较函数,或者作为std::function的参数。它的简洁和易用性使得在C++11中变得非常流行。
Lambda表达式的完整声明格式如下:
[capture list](parameter list) mutable exception-> return type { function body }
- capture list: 用于捕获外部变量的列表,可以省略。
- parameter list: 函数参数列表,可以省略。
- mutable: 可选项,用于指定能否修改捕获的变量。
- exception: 可选项,用于指定能抛出的异常。
- return type: 可选项,用于指定返回值类型。如果省略,编译器会自动推断。
- function body: 函数主体。
通常情况下,一个 lambda
表达式不需要如此多的关键词,更常用的声明形式如下,只需要captures、parameters、return type、body即可:
[captures] (parameters) ->return_type {body}
有一些情况下,返回类型可以从 return
语句中推导(如 auto
),则返回类型可以省略。而当 lambda
表达式没有参数的时候,用于表示参数列表的括号也是可以省略的:
[captures] {body}
//也就是
[]{}
具体的例子:
[](){} //定义一个没有参数和返回值的lambda表达式
[](int a, int b){ return a+b;} //定义一个带有参数的lambda表达式
[x](int a){ return x*a;} //定义一个捕获x的lambda表达式
Lambda表达式还可以使用默认参数值,通过在参数后面使用 "= default_value"来实现。
例如 :
[](int a, int b = 10){ return a + b;} //定义一个带有默认参数值的lambda表达式
在捕获列表中, 你可以使用&或=来捕获外部变量。
- & 使得lambda表达式可以修改捕获的变量。
- = 使得lambda表达式不能修改捕获的变量(默认值)。
例如 :
int x = 10;
[&x](){x++;} //定义一个可以修改x的lambda表达式
[=x](){x++;} //定义一个不能修改x的lambda表达式
Lambda表达式可以通过赋值给std::function对象或者直接调用来使用。
例如 :
std::functionadd = [](int a, int b){ return a + b;};
int result = add(1, 2);
二、lambda使用例子
2.1 STL算法中的回调函数STL算法如sort, for_each等需要一个可调用的对象来完成操作,这时候lambda表达式可以提供一种简洁的方式来定义这个可调用的对象。
#include
#include#includeint main()
{
std::vectorv{3, 1, 4, 1, 5, 9, 2, 6, 5};
std::sort(v.begin(), v.end(), [](int a, int b){ return a< b;});
for(int x : v)
std::cout<< x<< " ";
std::cout<< std::endl;
return 0;
}
sort第三个参数可以传入一个函数,是因为 sort 使用了模板,第三个参数是一个比较函数,它是一个可以接受两个参数并返回一个bool值的函数。sort函数使用这个比较函数来确定如何排序序列中的元素。如果第三个参数省略,sort默认使用“小于”运算符进行比较。
可以使用 std::less
std::sort(v.begin(), v.end(), std::less
或者你也可以定义一个比较函数来代替 lambda:
bool myCompare(int a, int b)
{ return a< b; }
std::sort(v.begin(), v.end(), myCompare);
2.2 回调函数在许多情况下,我们需要在某个对象的回调函数中进行某些操作,这时候lambda表达式可以提供一种简洁的方式来定义回调函数。
#includeclass Button
{
public:
void setOnClick(std::functiononClick) { m_onClick = onClick; }
void click() { m_onClick(); }
private:
std::functionm_onClick;
};
int main()
{
Button btn;
btn.setOnClick([](){std::cout<< "Button clicked"<< std::endl;});
btn.click();
return 0;
}
"setOnClick" 函数接收一个 std::function
"click" 函数调用了 "m_onClick",也就是之前设置的 std::function
在 main 函数中,一个 Button 对象 "btn" 被创建并初始化。 然后调用 btn.setOnClick({std::cout<< "Button clicked"<< std::endl;}); 这个方法,将一个 lambda 表达式作为参数设置给 m_onClick。 最后调用 btn.click(); 触发了上面设置的 lambda 表达式。
2.3 多线程编程在多线程编程中,我们需要启动一个新线程来执行某些操作,这时候lambda表达式可以提供一种简洁的方式来定义线程的操作。
#include#includeint main()
{
int x = 10;
std::thread t([&x](){ x++;});
t.join();
std::cout<< x<< std::endl;
return 0;
}
这段代码使用了 C++11 的线程库 std::thread。在 main 函数中,一个 int 类型的变量 x 被赋值为 10。然后创建了一个 std::thread 对象 "t",该对象的构造函数接收了一个 lambda 表达式,在这个 lambda 表达式中,变量 x 的值被自增。
三、总结在使用lambda时首先要明确它和普通函数一样,有函数地址、参数、返回值等等,使用起来不要有任何负担。第二就是掌握它复杂的使用方法需要多多使用,多多练习,C++新特性的学习有助于我们掌握更好的编程技巧。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网站名称:C++11匿名函数lambda的使用-创新互联
本文来源:http://hbruida.cn/article/hpjij.html