C++lambda表达式简单笔记
lambda表达式语法
#include <iostream>
int main(int argc, char* argv[])
{
/**
* 1. 基本形式与语法
*/
//如果没有传入参数,参数列表可以省略
auto lambda1 = []() { std::cout << "Hello, World !" << std::endl; };
auto lambda2 = [](int x, int y) -> int //返回参数可使用尾置返回语法
{
if (x > y)
return 1;
else if (x < y)
return -1;
else
return 0;
};
/**
* 输出:
* Hello, World !
*/
lambda1();
/**
* 输出:
* -1
*/
std::cout << lambda2(1, 2) << std::endl;
/**
* 输出:
* 1
*/
std::cout << lambda2(2, 1) << std::endl;
/**
* 输出:
* 0
*/
std::cout << lambda2(1, 1) << std::endl;
return 0;
}
捕获
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
int main(int argc, char* argv[])
{
/**
* lambda表达式捕获外部变量示例
*/
std::vector<int> vec{ 1,2,3,4,5,6,7,8,9,10 };
std::string str;
//&str为引用捕获,在函数内部可以被修改
std::for_each(vec.begin(), vec.end(), [&str](int n) {
str.append(std::to_string(n)).append(",");
});
str.pop_back();
/**
* 输出:
* 1,2,3,4,5,6,7,8,9,10
*/
std::cout << str << std::endl;
//argc为值捕获(拷贝),该变量在函数内部修改后不会影响外部变量
std::for_each(argv, argv + argc, [argc](char* args) {
/**
* 输出命令行参数
*/
std::cout << args << std::endl;
});
/**
* 关于其他捕获语法:
* [=]: 所有外部变量的捕获均为值捕获(拷贝)
* [&]: 所有外部变量的捕获均为引用捕获
* [=, var...]: var以引用捕获,其他外部变量以值捕获
* [&, var...]: var以值捕获,其他外部变量以引用捕获
*/
return 0;
}
其他
当lambda表达式不使用[]捕获时,其表现与函数指针相同;如果使用了[]捕获,则会变成带有成员变量(引用或拷贝)和重载operator()函数运算符的类,所以将lambda表达式代入参数为函数指针的函数时,不能使用[]捕获。
本文来自博客园,作者:Reimual,转载请注明原文链接:https://www.cnblogs.com/Reimual/p/19150187

浙公网安备 33010602011771号