关于lambda表达式和插入迭代器的一些说明
来源:互联网 发布:app应用下载推广源码 编辑:程序博客网 时间:2024/05/19 09:12
看下面例子,将容器中的数值都变成绝对值,然后存储到另外一个容器中:
#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
- 关于lambda表达式和插入迭代器的一些说明
- 关于lambda表达式一些用法
- 关于LINQ 和lambda表达式
- Lambda表达式和linq普通语法的一些对比
- 关于Squirrel3的Lambda表达式
- 关于Lambda表达式的概述
- 关于Erlang和SMP的一些说明
- 关于Erlang和SMP的一些说明
- 关于Android Studio和lambda表达式
- 一些java lambda表达式的笔记
- java8 Lambda表达式的一些特点
- Python的条件表达式和lambda表达式
- 关于Lambda表达式很好的几篇博文
- 关于boost中lambda表达式的学习
- 关于常用的Lambda(拉姆达)表达式
- Hibernate 表达式 的一些说明
- 关于c# lambda的一些认知
- 关于Lambda表达式
- 关闭 晓K的专栏 我的学习历程 目录视图摘要视图订阅 赠书 | 异步2周年,技术图书免费选 每周荐书:渗透测试、K8s、架构(评论送书) 项目管理+代码托管+文档协作,开发更
- Mac之使用curl命令分析请求的耗时情况
- C++框架和库
- iOS开发 与H5进行交互
- PHP实现数字补零功能的函数介绍
- 关于lambda表达式和插入迭代器的一些说明
- Oracle—存储过程(转)
- Jcaptcha和Kaptcha验证码使用入门
- 使用 soapUI 测试 REST 服务(并发测试)
- C++11:std::bind
- 会服系统数据库操作
- 线程的概念、线程与进程比较
- 前端模块化开发那点历史
- Event和Mutex区别