C++11系列学习之Lambda表达式
目录
- 一、为什么要有lambda表达式?
- 二、使用语法
- 捕获列表
- mutable影响lambda表达式
- std::bind和lambda表达式结合
- 三、std::function 和lambda表达式选择
前言:
终于在C++11中引入了lambda表达式,lambda最早来源于函数式编程,现代语言慢慢都引入了这个语法,C++也不甘落后,在新标准中加入了lambda表达式。
一、为什么要有lambda表达式?
- 使用方便,就地声明函数或函数对象,尤其是和bind配合食用更佳
- 简洁,可以匿名创建,语法看起来极其舒适
- 可以实现功能闭包,使用起来更加灵活
二、使用语法
lambda的通用语法:[ 捕获列表] ( 参数表 ) 函数选项 -> 返回值类型 { 函数体 ;};
捕获列表
- [] 不捕获任何变量
- [&] 以引用方式捕获外部作用域中所有变量
- [=] 以值的方式捕获外部作用域中的所有变量
- [= , &x] 以值方式捕获外部作用域变量,但是以引用方式捕获x变量
- [ x ] 按值方式捕获 x 变量
- [ this ] 捕获当前类的this指针,那么lambda表达式拥有了和类成员函数同样的权限,如果使用了& 或 = 那么默认添加了此项
mutable影响lambda表达式
被mutable 修饰的lambda表达式就算没有参数也要写明参数列表,若没有加mutable,lambda不能修改这个变量的值,只能使用。 但是被修饰后的lambda表达式,会像函数传递参数一样,在内部定义一个变量并拷贝这个值。
#include <iostream> using namespace std; int main() { size_t t = 9; auto f = [t] () mutable {return ++t; }; cout << f() << endl; //10 cout << f() << endl; //11 cout << "t:" << t << endl; //9 return 0; }
可以把它视为带有重载括号运算符的仿函数,并且没有捕获任何变量的lambda表达式可以被转换成一个普通的函数指针
//用std::function来存储和操作lambda表达式 std::function<int, int> f1 = [](int a){ return a}; //转换为一个普通的函数指针 using fun = int(*){int}; fun f =[](int a){return a;} f(1)
std::bind和lambda表达式结合
//eg : 用来集合中计算大于5小于10的元素的个数 auto f = std::(std::logical_and<bool>(), std::bind( std::greater<int>(), _1, 5), std::bind(std::lesss<int>(),_1, 10)); int count = std::count::_if(coll.bengin(), coll.end(),f);
三、std::function 和lambda表达式选择
lambda
和std::function
的效果是一样的,但是更加简洁一些,但不能完全代替,因为一些老的库不支持lambda表达式
到此这篇关于C++11系列学习之Lambda表达式的文章就介绍到这了,更多相关C++11Lambda表达式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
赞 (0)