C++之 lambda表达式

本文深入探讨C++中Lambda表达式的使用,包括其语法结构、如何传递参数、捕获列表的使用,以及如何指定返回类型。通过实例展示了Lambda在实际编程中的应用,如在std::transform中的使用。

lambda表达式的使用

对于一个对象或者表达式,如果对其可以使用调用运算符,则称他是可调用的,即如果e是可调用的,则我们可以编写代码
e(args),其中args是一个逗号分隔的一个或多个参数的列表,C++中有4种可调用对象,

  1. 函数
  2. 函数指针
  3. 重载了函数调用运算符的类
  4. lambda表达式

一个lambd表达式表示一个可调用的代码单元,我们可以将其理解为一个未命名的内联函数
一个lambda具有一个返回类型,一个参数列表,和一个函数体,它具有以下的形式
[capture list] (parameter list) -> return type {function body;}


与普通函数不同的是lambda必须使用尾置返回:
C++11定义了一种尾置返回类型,任何函数都可以使用尾置返回,但是这种形式对于返回形式比较复杂的函数最有效
func接受一个int类型的实参,返回一个指针,该指针指向含有10个整数的数组
auto func(int i) -> int*[10]


我们可以忽略参数列表和返回类型,但是必须包含捕获列表和函数体
auto f = [] {return 42;}
向lambda传递参数以及捕获列表

int main()
{
    vector<string> ve{"10","dwdw"};
    char c = ' ';
    ofstream out1("FilePath");
    for_each(ve.begin(), ve.end(),
             [&out1, c](const string &s){out1 << s << c;});
    out1.flush();
    return 0;
}

这里lambda捕获 ofstream的引用(流只能引用,不能复制或者赋值)以及字符c,接受一个string的引用。
除此之外我们还可以通过隐式捕获的方式让编译器自己推断出要使用的变量,我们只需要告诉编译器是值传递[=]还是引用[&]

指定lambda的返回类型

默认情况下,如果一个lambd未指定返回类型,并且lambda中包含除return外的其他语句,那么编译器假定这个lambda的返回值是void的,下面是一个简单的例子,我们使用标准库的transform算法和一个lambda来将序列中的每一个负数替换为其绝对值

transform(ve.begin(),ve.end(),ve.begin(),
              [](int i){return i < 0 ? -i : i;})

但是如果将程序内容改为下面的等价形式,下面的代码就是错误的

//错误代码,lambda函数体含有除return外的语句
//编译器推断这个lambda返回void类型,但是实际上返回了int
transform(ve.begin(),ve.end(),ve.begin(),
              [](int i){if(i < 0) return -i;else return i;})

正确的写法应该显式规定返回类型,并且需要使用尾置返回。

//显式指定lambda返回类型为int
transform(ve.begin(),ve.end(),ve.begin(),
              [](int i) -> int 
              {if(i < 0) return -i;else return i;})
要使用清华镜像源安装Anaconda,你需要进行以下步骤: 1. 打开Anaconda安装包位置下的`anaconda_navigator\api\conda_api.py`文件,可以在`anaconda3\Lib\site-packages`目录下找到该文件。在第1364行,将`data = yaml.load(f)`改为`data = yaml.safeload(f)`。这样可以确保在加载配置文件时不会执行任意代码,提高安全性。\[1\] 2. 找到用户目录下的`.condarc`文件,可以使用记事本打开。请注意,该文件通常是隐藏的,你需要先显示隐藏的项目。在文件中,将内容修改为以下内容: ``` channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud ``` 这样修改后,Anaconda将使用清华镜像源进行安装和更新。\[2\]\[3\] 请确保在修改配置文件时备份原始文件,以防止意外情况发生。 #### 引用[.reference_title] - *1* [Anaconda的安装以及使用清华源镜像安装pytorch](https://blog.youkuaiyun.com/aurora_0_0_7/article/details/120679312)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [anaconda清华镜像源使用](https://blog.youkuaiyun.com/weixin_46288319/article/details/124427980)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Anaconda清华镜像--安装、配置与使用](https://blog.youkuaiyun.com/jialong_chen/article/details/121485308)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值