lambda 匿名函数
现阶段,编译器会将lanmbda匿名函数,转换为仿函数!故,stl算法完全可以使用lambda匿名函数。
auto b2 = [a, &b] (int c) -> int{ // a只读, b读写
b = a + c;
return a + c;
}(1000);
[var] 传值方式(只读)将变量传递到匿名函数中
[=] 父作用范围的所有变量以传值方式(只读),传递到匿名函数中(包括this)
[&var] 引用方式(读写)将变量传递到匿名函数中
[&] 父作用范围的所有变量以引用方式(读写),传递到匿名函数中(包括this)
[this] 传递当前this指针
[=,&var1,&var] var1,var2以读写方式传递到匿名函数中,其他变量以只读方式传递到函数中
[&,var1,this] var1,this以只读方式传递到函数中,其他变量以读写方式传递到函数中
捕捉非父作用范围的变量,或者非自变量(如,静态常量)等,都将导致编译错误。故可以看出,匿名函数
现阶段,编译器会将lanmbda匿名函数,转换为仿函数!故,stl算法完全可以使用lambda匿名函数。
auto b2 = [a, &b] (int c) -> int{ // a只读, b读写
b = a + c;
return a + c;
}(1000);
[var] 传值方式(只读)将变量传递到匿名函数中
[=] 父作用范围的所有变量以传值方式(只读),传递到匿名函数中(包括this)
[&var] 引用方式(读写)将变量传递到匿名函数中
[&] 父作用范围的所有变量以引用方式(读写),传递到匿名函数中(包括this)
[this] 传递当前this指针
[=,&var1,&var] var1,var2以读写方式传递到匿名函数中,其他变量以只读方式传递到函数中
[&,var1,this] var1,this以只读方式传递到函数中,其他变量以读写方式传递到函数中
捕捉非父作用范围的变量,或者非自变量(如,静态常量)等,都将导致编译错误。故可以看出,匿名函数
非动态函数,在编译期就定义了,故不会产生额外开销。
#include <iostream>
#include <typeinfo>
/*
*
*/
int main(void) {
auto sum = [](int x, int y) -> int {return x + y;}; // 将创建的匿名函数赋值给sum
std::cout << typeid(sum).name() << std::endl;
int x = 10, y = 20;
auto result = sum(x, y);
std::cout << "result : " << result << std::endl;
[]{
std::cout << "Done1" << std::endl;
};
// 只是声明了一个lambda函数,但未调用
[]{
std::cout << "Done2" << std::endl;
}();
// 声明并调用一个lambda函数
int a = 1, b = 10;
// 无法通过编译
// [] {
// return a + b; // 错误:‘a’未被捕获 错误:‘b’未被捕获
// };
[=] { // [=] 通过捕捉,获得上下文的数据,所以可以使用变量a,b,但无法修改a,b
return a + b;
};
std::cout << "b = " << b << std::endl;
[&] (int c) { // [&] 捕捉上下文,并且可以修改a,b
b = a + c;
}(50);
std::cout << "b = " << b << std::endl;
// [&a, b] (int c) { // a可以在函数体中被修改,而b不能
// b = a + c;
// }(1000);
auto b2 = [a, &b] (int c) -> int{ // a只读, b读写
b = a + c;
return a + c;
}(1000);
std::cout << "b = " << b << " b2 = " << b2 << std::endl;
return 0;
}
#include <iostream>
#include <algorithm>
#include <list>
struct {
public:
void operator()(const int& i) {
std::cout << i << std::endl;
}
} p1;
/*
*
*/
int main(void) {
std::vector<int> ids{1, 2, 3, 4, 5};
std::for_each(ids.begin(), ids.end(), p1);
std::cout << "\n---------------------------" << std::endl;
std::for_each(ids.begin(), ids.end(), [](int& i) {std::cout << i << std::endl; });
return 0;
}
lambda与c++11线程的使用,非常的灵活,强大。
/*
* File: main.cpp
* Author: Vicky.H
* Email: eclipser@163.com
*/
#include <iostream>
#include <thread>
/*
*
*/
int main(void) {
int i = 0;
std::thread t(
[&i]() {
for (;;) {
std::this_thread::sleep_for(std::chrono::seconds(1));
i++;
}
}
);
t.detach();
for (;;) {
for (;;) {
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "i = " << i << std::endl;
}
}
return 0;
}
i = 1
i = 1
i = 2
i = 3
i = 5
i = 5
i = 7
i = 8