C++2.0新增了lambda(inline)表达式
int main(int argc, char* argv[])
{
// 定义一个lambda表达式
// lambda表达式语法:[capture var...](inType...) mutable(opt) throwAble(opt) -> returnType(opt) { BODY };
// lambda表达式的类型复制,一般使用auto来声明
auto lambda1 = []{cout << "Hello LAMBDA" << endl; }/*()*/;// 最简的lambda,必须要有捕捉[]参数和{}Body
lambda1();// lambda需要手动来调用,只能通过()的形式来调用
int x = 3, y = 4;
cout << "x:" << x << " y:" << y << endl; // 3 4
// [...]声明捕捉数据,lambda对外不可见的,通过[...]来声明哪些参数lambda可以使用
// [...]有两种传递参数的方法:传值和传引用,默认参值,传递引用使用'&',传值使用'='
// [=,&y]这样表示除了y使用引用类型之外,其余的都是传值
// 当传值的数据需要在lambda内部进行操作的时候,需要使用mutable来声明有传递值,引用类型不需要声明
// throw抛异常
// -> type返回什么类型,返回类型会自动判断
auto lambda2 = [x, &y](int in)mutable throw(runtime_error) -> int
{
x += 1;
y += 1;
cout << "x:" << x << " y:" << y << " in:" << in << endl;// 4 5 5
return x;
};
lambda2(5);
cout << "x:" << x << " y:" << y << endl; // 3 5
// lambda 实例:移除大于minClamp和小于maxClamp之间的数据
vector<int> v1 = { 21, 34, 13, 56, 79, 81, 30 };
int minClamp = 30, maxClamp = 80;
// auto num = _Erase_remove_if(v1, [minClamp, maxClamp](int in) {return in > minClamp && in < maxClamp; }); // VS2019可以这样使用
// remove_if是从一个迭代器的begin()和end()之间移除满足predicate(断言)成功的数据
// 执行过程从first一直到end(),但这个first是基于predicate之后的数据
v1.erase(remove_if(v1.begin(), v1.end(), [minClamp, maxClamp](int in) {return in > minClamp && in < maxClamp; }), v1.end());
for (auto v : v1) { cout << v << " "; }
// cout << "\n" << num;
}
输出结果
C++ 2.0关键字
since C++11是2.0新增的关键
defalut(1)这个关键字有一个内容更新