关于lambda表达式和插入迭代器的一些说明

看下面例子,将容器中的数值都变成绝对值,然后存储到另外一个容器中:

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
int main(){

    std::vector<int> v1={1,2,3,-4,-5,-6},v2;
    auto iv=std::back_inserter(v2);

    std::for_each(v1.begin(),v1.end(),[iv](const int &i) mutable {i>0 ? *iv=i : *iv=-i;});

    *iv=999;
    for(const auto &i:v2) std::cout<<i<<' ';
    std::cout<<std::endl;

    return 0;
}

代码输出值为:1  2  3  4  5  6  999


上面有两点需要注意:

1. lambda表达式中捕获列表如果是值捕获的话,如果需要改变捕获后的变量或者变量指向的值,则必须在函数体{}前面加上mutable ,不然编译失败;

2. 一般情况下,对于普通的迭代器,如果容器的元素个数改变的话,迭代器很可能会失效,但是对于插入迭代器,此迭代器是不会失效的,lambda表达式中的迭代器iv和外部的iv不是同一个变量。在lambda表达式中,我们用lambda中的iv为容器v2创建元素,并不是用外部的iv来创建的。不过下面的 *iv=999; 是用外部iv来创建元素的。来看一个例子:

std::vector<int> v2;
auto iv=std::back_inserter(v2);
auto iv1=std::back_inserter(v2);

*iv=4;
*iv1=5;
v2中保存的元素为4, 5


此外,如果将lambda表达式中的捕获列表改为引用捕获,则就不需要mutable就能在lambda中改变被捕获变量的值了:

std::for_each(v1.begin(),v1.end(),[&iv](const int &i) {i>0 ? *iv=i : *iv=-i;});

并且此时lambda表达式中的iv与外部的iv是同一个变量。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值