1. #include<iostream>
  2. #include<algorithm>
  3. #include<sstream>
  4. #include<vector>
  5. #include<cstring>
  6. #include<functional>//bind函数的头文件
  7. //#include <boost/tokenizer.hpp>
  8. usingnamespace std;
  9. usingnamespace placeholders;//_n占位符所要使用的命名空间
  10. /**
  11. * 本程序首先将一个字符串划分成单词存储到容器中去
  12. * 在使用系统提供的算法时,讨论了一元谓词与二元谓词
  13. * 接下来讨论了lambda表达式及其用法
  14. *
  15. * 在很多地方使用同一个函数,一个操作需要很多语句才能完成
  16. * 通常采用使用函数而不是lambda表达式,为了解决一元谓词等的限制,引入标准库bind函数
  17. */
  18. void elimDups(vector<string>& words)
  19. {
  20. sort(words.begin(), words.end());
  21. auto end_unique = unique(words.begin(), words.end());
  22. words.erase(end_unique, words.end());
  23. }
  24. bool compElement(const string & str)
  25. {
  26. return str.length()<5?1:0;
  27. }
  28. void displayVector(vector<string>::iterator beginPos,vector<string>::iterator endPos)
  29. {
  30. while(beginPos != endPos)
  31. {
  32. cout <<*(beginPos++)<< endl;
  33. }
  34. cout << endl;
  35. }
  36. /**< 值捕获 */
  37. void fcn1()
  38. {
  39. size_t v1 =42;
  40. //将v1拷贝到名为f的可调用对象
  41. auto f =[v1]{return v1;};//从lambda类类型生成一个类对象f。在f创建时,使用捕获变量V1给其数据成员v1进行初始化(值拷贝),
  42. v1 =0;
  43. v1 = f();
  44. cout <<"显式捕获--值赋值--"<< v1 << endl;
  45. }
  46. /**< 默认情况下,值捕获是不能改变变量的值,若要改变则需加上mutable关键字 */
  47. void fcn4()
  48. {
  49. size_t v4 =42;
  50. auto f4 =[v4]()mutable
  51. {
  52. return++v4;//观察与fcn1的区别
  53. };
  54. cout <<"mutable--"<< f4()<< endl;
  55. cout <<"mutable--v--"<< v4 << endl;//非引用捕获无法更改捕获变量的值
  56. }
  57. /**< 引用捕获 */
  58. void fcn2()
  59. {
  60. size_t v1 =42;
  61. auto f2 =[&v1]//在f2被创建时,其成员变量v1将引用外部的v1
  62. {
  63. v1 =100;//v1是非const类型,故而能被修改
  64. return v1;
  65. };//构建一个lambda类对象,使用v1给对象的数据成员赋值,此时函数体并未执行
  66. cout << v1 << endl;//42---函数体未执行
  67. cout << f2()<< endl;//100---函数体开始执行
  68. cout <<"显式捕获--引用赋值--"<< v1 << endl;//42---采用的是引用捕获,在函数体被执行时,v1被修改
  69. }
  70. /**< 隐式捕获 */
  71. void fcn3()
  72. {
  73. int v3 =0;
  74. auto f3 =[=]
  75. {
  76. return v3;
  77. };
  78. cout <<"隐式捕获--值赋值--"<< f3()<< endl;
  79. auto f4 =[&]
  80. {
  81. v3 =100;
  82. return v3;
  83. };
  84. cout <<"隐式捕获--引用赋值--"<< f4()<< endl;
  85. cout << v3 << endl;
  86. }
  87. /**
  88. * 混合捕获方式(前边的符号代表隐式捕获的类型,后边的参数列表要与其不同)
  89. * [&,identifier_list] identifier_list采用值捕获方式,identifier_list列表中的各个名字前不能使用&
  90. * 而任何隐式捕获的变量都采用引用方式捕获
  91. * [=,identifier_list] identifier_list采用引用捕获方式,identifier_list列表中的各个名字之前必须使用&
  92. * 而任何隐式捕获的变量都采用引用方式捕获
  93. */
  94. /**< bind函数的实现 */
  95. //先实现要绑定的函数,然后在要使用的地方使用bind函数进行绑定
  96. bool newCompElement(const string & str,constint sz)
  97. {
  98. return str.length()< sz ?1:0;
  99. }
  100. int main()
  101. {
  102. char wordLine[]="The consequences of today are determined by the actions of the past. \
  103. To change your future, alter your decisions today.";
  104. vector<string> strVector;
  105. /**
  106. istringstream lineStream(wordLine);//istringsream默认以空格或\t或\n切割字符串,不能进行设定
  107. while(lineStream>>word)
  108. {
  109. strVector.push_back(word);
  110. }
  111. */
  112. //strtok()
  113. char seps[]=" ,.\t\n";
  114. char* word = strtok(wordLine, seps);
  115. while(word != NULL)
  116. {
  117. strVector.push_back(word);
  118. word = strtok(NULL, seps);
  119. }
  120. for(auto val : strVector)
  121. {
  122. cout << val <<" ";
  123. }
  124. cout << endl;
  125. // elimDups(strVector);
  126. /**< 根据字符串长度是否 < 5,将容器中的字符串重新排列 */
  127. vector<string>::iterator partPos = partition(strVector.begin(), strVector.end(), compElement);
  128. displayVector(partPos, strVector.end());
  129. /**
  130. * 尾置返回类型
  131. * auto func(int i) -> int(*)[10];
  132. * 这是一个函数声明,该函数返回一个指针,该指针指向含有10个int类型的数组
  133. *
  134. * lambda表达式:
  135. * [capture list] (parameter list) -> return type {function body}
  136. * 通常定义一个可调用f,使其等于该lambda表达式
  137. * 例如:auto f = [] {return 42;};
  138. *
  139. * lambda的调用方式与普通函数的调用方式相同,都是使用调用运算符
  140. * cout << f() << endl;//打印42
  141. * lambda表达式可以忽略参数列表和返回类型,但必须包含捕获列表和函数体(内容可以为空)
  142. * 捕获列表只用于局部非static变量,lambda可以直接使用局部static变量和在其函数之外声明的名字
  143. */
  144. size_t sz =5;
  145. auto compSize =[sz](const string & str)->bool
  146. {
  147. return str.length()< sz;
  148. };
  149. partPos = partition(strVector.begin(), strVector.end(), compSize);//这里也可以直接使用lambda表达式替换compSize
  150. displayVector(partPos, strVector.end());
  151. /**< 使用bind函数进行绑定 */
  152. auto newCompEle = bind(newCompElement, _1, sz);
  153. partPos = partition(strVector.begin(),strVector.end(), newCompEle);
  154. //相当于partition(strVector.begin(),strVector.end(), bind(newCompElement, _1, sz));
  155. displayVector(partPos, strVector.end());
  156. /**< 测试lambda的各种捕获 */
  157. fcn1();
  158. fcn2();
  159. fcn3();
  160. fcn4();
  161. return0;
  162. }
  163. /**
  164. * 默认情况下,bind那些不占位符在给bind对象进行赋值时采用的是值拷贝的方式
  165. * 如要要用引用方式传递或绑定对象无法进行拷贝,使用ref来实现引用方式传递
  166. *
  167. * bind(words.begin(),words.end(),bind(print,ref(os),_1,' ');
  168. * ostream &print(ostream &os,const string &s,char c);
  169. *
  170. * 函数ref返回一个对象,包含给定的引用,此对象是可以拷贝的。
  171. * cref函数保存const引用的类
  172. */

 

lambda表达式与bind函数的更多相关文章

  1. C++ Primer : 第十章 : 泛型算法 之 lambda表达式和bind函数

    一.lambda表达式 lambda表达式原型: [capture list] (parameter list) -> retrue type { function body } 一个lambd ...

  2. kotlin之lambda表达式和匿名函数

    lambda表达式,称为匿名函数,是一种函数字面值,也就是没有声明的函数,但可以作为表达式传递出去. 函数类型: 对于接受另一个函数的作为自己的参数,必须针对这个参数指定一个函数的类型如 fun &l ...

  3. Python函数与lambda 表达式(匿名函数)

    Python函数 一.函数的作用 函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段 函数能提高应用的模块性和代码的重复利用率 python 内置函数:https://docs.pytho ...

  4. Lambda表达式公共拼接函数(原创)

    #region Lambda公共拼接函数 /// <summary> /// LambdaWhere(枚举) /// </summary> public enum Lambda ...

  5. 第三天 函数 三元运算 lambda表达式 内置函数 文件操作

    面向过程: 直接一行一行写代码,遇到重复的内容复制黏贴. 不利于代码阅读 代码没有复用 面向对象 将代码块定义为函数,以后直接调用函数 增强了复用性 函数的定义方法 def 函数名(传递参数): 函数 ...

  6. lambda表达式,map函数

    lambda只是一个表达式,不需要定义函数,故也是匿名函数,用法为:lambda 参数:表达式. x=5 list1=[2,3,4] list2=[10,20,30] s=lambda x:x**3 ...

  7. C++11 Lambda表达式(匿名函数)

    http://www.cnblogs.com/RainyBear/p/5733399.html http://blog.163.com/lvan100@yeah/blog/static/6811721 ...

  8. lambda表达式、匿名函数

    lambda表达式是函数式编程中的匿名函数语法规范. In computer programming, an anonymous function (function literal, lambda ...

  9. Lambda 表达式-即匿名函数

    拉姆达值(Lambda),希腊字母表示为Λ,指与真空的空间有关的能量或暗能量.   代表转换的常量.或者转换本身.   Lambda 表达式 Lambda 表达式”是一个匿名函数,可以包含表达式和语句 ...

随机推荐

  1. HYSBZ(BZOJ) 4300 绝世好题(位运算,递推)

    HYSBZ(BZOJ) 4300 绝世好题(位运算,递推) Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<= ...

  2. beego 返回 json 响应

    需要注意的是 json 结构体里面的字段必须是大写字母开头,否则是不会返回的. 我们可以起个别名: type person struct { Name string `json:"name& ...

  3. 5.Qt模块简介

    Qt 5 与 Qt 4 最大的一个区别之一是底层架构有了修改.Qt 5 引入了模块化的概念,将众多功能细分到几个模块之中.Qt 4 也有模块的概念,但是是一种很粗的划分,而 Qt 5 则更加细化.本节 ...

  4. Python如何引入自定义模块?

    Python运行环境在查找库文件时是对 sys.path 列表进行遍历,如果我们想在运行环境中注册新的类库,主要有以下四种方法: 1.在sys.path列表中添加新的路径.这里可以在运行环境中直接修改 ...

  5. python 生成器和迭代器介绍

    在正式接触生成器之前,我们先来了解一些概念 容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个迭代获取,可以用in.not in关键字判断元素是否包含在容器中. ...

  6. jquery 格式化数字字符串(小数位)

    用于页面上格式化数字字符串,此代码为工作时所需,留作笔记,比较常用. /** * author: xg君 * 描述: 格式化数字字符串,格式化小数位 * obj为需要格式的对象(例如:input标签) ...

  7. windows下自动启动Redis隐藏命令行窗口

    这段时间看了看关于Redis的相关内容,对于Redis在windows下的安装和常规启动我就不多说了.可以参考其他的博客http://www.cnblogs.com/edisonchou/p/3821 ...

  8. xgraph和gnuplot初体验

    今天分别体验了一下xgraph和gnuplot.   xgraph是ns2自带的画图工具,使用很简单.它的标准的数据文件是ascii文本文件,每一行两个数据,以空格隔开,这样就有了两列数据.把这样的文 ...

  9. 网络爬虫框架Heritrix中Modules的各项说明

    1)Select Crawl Scope:Crawl Scope 用于配置当前应该在什么范围内抓取网页链接.例如选择 BroadScope 则表示当前的抓取范围不受限制,选择 HostScope 则表 ...

  10. Struts S2-052漏洞利用之Meterpreter(CVE-2017-9805)

    Struts S2-052漏洞爆出来已经快一周了,大家可能更想知道其危害~鸡肋? 这里就直接给出漏洞利用拿Meterpreter的过程,想了解更多的请参考其他文章,下面是实验演示部分.Struts S ...