lambda 的[=],[&]方式, 根据lambda的实现知道:
=:方式为传值,在lambda定义的时候,初始化状态就确定了
&:方式为引用,那么引用的对象或者变量,会根据lambda执行的时候,再确定初始化状态 这一点很重要
我们可以用 typeid(lambda).name() 来看看不同编译器,对于lambda的类型到底是什么
lambda 默认是带有const 属性的,如果要在函数体内,改变捕捉变量的值,那么要加上mutable,去掉const属性
lambda 与 STL:
inline void func(int a)
{
cout<<a<<endl;
}
vector<int > vec{1,2,3,4,5};
for(auto iter=vec.begin();iter!=vec.end();++iter)
{
func(*iter);
}
for_each(vec.begin(),vec.end(),func);
for_each(vec.begin(),vec.end(),[](int val){ cout<<val<<endl;});
哪种简单明了? 一目了然
map<int,string> _map
{
{1,"hello "},
{2,"china "},
{3,"who "},
{4,"are "},
{5,"you "},
{6,"?"},
};
for_each(_map.begin(),_map.end(),[](auto iter){cout<<iter.first<<":"<<(iter.second.c_str())<<endl;});
是不是这样用map,很爽?
vector<int> vec{1,2,3,4,5};
auto iter=find_if(vec.begin(),vec.end(),[](int val){return val==2;});
cout<<*iter<<endl;
这样用 find_if ,一眼就知道你要干什么。
for_each(vec.begin(),vec.end(),[](int & val){val+=5;});
for_each(vec.begin(),vec.end(),[](const int val){cout<<val<<endl;});
容器自增5
vector<int> vec(10);
generate(vec.begin(),vec.end(),[](){return rand()%10;});
for_each(vec.begin(),vec.end(),[](const int val){cout<<val<<endl;});
随机值初始化容器
lambda更多的时候,是配合STL的经过调优后的算法使用,可以大大节省开发时间与精力的投入。
但是要把lambda用好,不经过长期的磨练,踩足够多的坑,也是很难完全掌握的。