STL - C++ 11的Lambda表达式(上)
Lambda始自C++ 11,是一种在表达式或语句内指定函数行为的定义式。
你可以定义函数行为作为对象,以inline实参的形式传给算法作为predicate(判断式)。
eg:
std:transform(coll.begin(), coll.end(), // source
coll.begin(), // destination
#include <algorithm>
#include <deque>
#include <iostream>
#include "LambdaTest.h"
#include "../../Core/ContainerUtil.h" using namespace std; deque<int> coll = { , , , , , , , , }; cout << "all elements:" << endl;
ContainerUtil<deque<int>>::printElements(coll); int x, y;
cout << "Input x: ";
cin >> x;
cout << endl;
cout << "Input y: ";
cin >> y;
cout << endl;
auto pos = find_if(coll.cbegin(), coll.cend(), // range
[=](int i) { // search criterion
return i > x && i < y;
}); cout << "first elem >"<< x <<" and <"<< y <<": " << *pos << endl;
[](double d) { // lambda as function object
return d*d*d;
});
看个简单的例子:
findFirstInRange.cpp
运行结果:
all elements: 1 3 19 5 13 7 11 2 17
Input x: 5
Input y: 18
first elem >5 and <18: 13
注意点:
[=]
这个符号表明在lambda被声明时已有效的所有符号都以传值(by value)的形式传入lambda体内
[&]
这个符号表明在lambda被声明时已有效的所有符号都以传引用(by reference)的形式传入lambda体内
lambda内部可以改动他们的值
上面例子lambda的等价物
auto pos = find_if(coll.cbegin(), coll.cend(), // range
[=](int i) { // search criterion
return i > x && i < y;
});
它等价于
1. 手写的循环
deque<int>::iterator pos;
for (pos = coll.begin;pos!=coll.end(); ++pos)
{
if (*pos > x && *pos < y)
{
break;
}
}
2. predicate(判断式)
bool pred(int I)
{
return I > x && I < y;
} ... pos = find_if(coll.begin(), coll.end(), pred);
STL - C++ 11的Lambda表达式(上)的更多相关文章
- STL - C++ 11的Lambda表达式(下)
关于lambda的基础知识,请参考上一篇的地址如下: http://www.cnblogs.com/davidgu/p/4825625.html 我们再举个STL使用Lambda来进行排序的例子,如下 ...
- 「C++11」Lambda 表达式
维基百科上面对于 lambda 的引入是如下描述的: 在标准 C++,特别是当使用 C++ 标准程序库算法函数诸如 sort 和 find.用户经常希望能够在算法函数调用的附近定义一个临时的述部函数( ...
- C++11之lambda表达式
lambda表达式源于函数式编程的概念,它可以就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象.lambda表达式的类型在C++11中被称为"闭包类型",也可以 ...
- C++11 里lambda表达式的学习
最近看到很多关于C++11的文档,有些是我不怎么用到,所以就略过去了,但是lambda表达式还是比较常用的,其实最开始学习python的时候就觉得lambda这个比较高级,为什么C++这么弱.果然C+ ...
- 【C++11】 lambda表达式
i.e.int x = 10;int y = 20;int z = [&]{ x = x * x; y = y * y; return x + y;}(); 上面z后面以[]开头的为一个lam ...
- C++11之lambda表达式应用
应用 foreach语句中 #include <time.h> #include <algorithm> using namespace std; void func(int ...
- C++11之lambda表达式解析
什么是Lanmbda? 简短函数,就地书写.常用于向函数(算法)传递函数参数. 语法 Lambda 表达式,[capture](paras)mutable->return type{statem ...
- c++11:lambda表达式的使用
lambda表达式的一般形式: [capture list] (parameter list) -> return type{function body}; 其中,capture list (捕 ...
- C++ 11 Lambda表达式
C++11的一大亮点就是引入了Lambda表达式.利用Lambda表达式,可以方便的定义和创建匿名函数.对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多 ...
随机推荐
- linux——(3)文件与目录管理
文件与目录管理相关指令 ls [-adlR] 目录 #查看目录与文件的命令. -a #连同隐藏文件一起列出来. -d #只列出目录. -l #列出相关属性和权限等数据. -R #连同子目录内容一起列出 ...
- 简述HttpSession的作用、使用方法,可用代码说明
HttpSession中可以跟踪并储存用户信息,把值设置到属性中,有2个方法:setAttribute(),getAttrribute(): 例如:在一个方法中用session.setAttribut ...
- 创建操作表(UIActionSheet)
UIActionSheet用来创建一个操作表,它的初始化代码如下: - (IBAction)testActionSheet:(id)sender { UIActionSheet *actionShee ...
- JAVA中关于大数问题
这里只是java速成,只限于java语法,包括输入输出,运算处理,字符串和高精度的处理,进制之间的转换等,能解决OJ上的一些高精度题目. 一.样例:java中的输出a+b import java.io ...
- LOJ#2471「九省联考 2018」一双木棋 MinMax博弈+记搜
题面 戳这里 题解 因为每行取的数的个数是单调不增的,感觉状态数不会很多? 怒而记搜,结果过了... #include<bits/stdc++.h> #define For(i,x,y) ...
- BZOJ3238 [Ahoi2013]差异 SA+单调栈
题面 戳这里 题解 考虑把要求的那个东西拆开算,前面一个东西像想怎么算怎么算,后面那个东西在建出\(height\)数组后相当于是求所有区间\(min\)的和*2,单调栈维护一波即可. #includ ...
- Java 请求webServce接口 不带参数
最近对接了个webService的接口取数据,从网上良莠不齐的代码中找到了个方法, 具体作者已经记不住是谁了,现在把代码贴出来,希望可以帮到大家,代码如下,简单粗暴 public String get ...
- Centos7 下mysql大小写敏感问题
在Centos7 下mysql大小写敏感问题,会导致程序运行时找不到对应的表. 解决办法: 第一步:编辑/etc/my.cnf文件,在[mysqld]节下 添加 lower_case_table_na ...
- python开发_calendar
如果你用过linux,你可能知道在linux下面的有一个强大的calendar功能,即日历 在python中,同样也有这样的一个强大的calendar 下面是我做的demo: #python中的cal ...
- pt-archive提速的实践经验
最近遇到很多业务需求,需要进行数据导出工作,由于有格式要求,故之前一直使用mysqldump的方法. mysqldump -uuser -ppassword -S mysql.sock -t db t ...