版权声明:本文为博主原创文章。未经博主同意不得转载。

https://blog.csdn.net/cutter_point/article/details/32301839

定制操作_2

完整的biggies

好吧上一章是有点2B了,我的,昨天可能是刚考完心情有点小激动就不想学习了,我错了!

  1. /**
  2. * 功能:定制操作
  3. * 时间:2014年6月19日07:32:03
  4. * 作者:cutter_point
  5. */
  6. #include<iostream>
  7. #include<vector>
  8. #include<string>
  9. #include<numeric>
  10. #include<algorithm>
  11. using namespace std;
  12. void elimDups(vector<string> &words)
  13. {
  14. //按字典顺序排列
  15. sort(words.begin(), words.end());
  16. //unique重排输入范围,使每一个单词出现一次
  17. //排列在范围的前部,返回不反复区域之后一个位置的迭代器
  18. auto end_unique=unique(words.begin(), words.end());
  19. //使用向量操作erase删除反复单词
  20. words.erase(end_unique, words.end());
  21. }
  22. //假设ctr的值大于1。返回word的复数形式
  23. string make_plural(size_t ctr, const string &word, const string &ending)
  24. {
  25. return (ctr>1)?word+ending:word;
  26. }
  27. void biggies(vector<string> &words, vector<string>::size_type sz)
  28. {
  29. elimDups(words); //将words按字典顺序排列,删除反复单词
  30. //按长度排序。长度同样的单词维持字典序
  31. stable_sort(words.begin(), words.end(),
  32. [](const string &a, const string &b){return a.size()<b.size();});
  33. //获取一个迭代器,指向第一个满足size()>=sz的元素
  34. auto wc=find_if(words.begin(), words.end(),
  35. [sz](const string &a){return a.size()>=sz;});
  36. //计算满足size>=sz的元素的数目
  37. auto count=words.end()-wc;
  38. cout<<count<<" "<<make_plural(count, "word", "s")
  39. <<" of length "<<sz<<" or longer "<<endl;
  40. //打印长度大于等于给定值的单词,每一个单词后面接一个空格
  41. for_each(wc, words.end(), [](const string &s){cout<<s<<" ";});
  42. cout<<endl;
  43. }
  44. int main()
  45. {
  46. vector<string> words={"fox","jumps","over","quick","red","red","slow","the","the","turtle"};
  47. size_t v1 = 4;
  48. biggies(words, v1);
  49. return 0;
  50. }

课后的几个习题

  1. /**
  2. * 功能:编写一个lambda。接受两个int,返回他们的和
  3. * 时间:2014年6月19日08:10:08
  4. * 作者:cutter_point
  5. */
  6. #include<iostream>
  7. #include<algorithm>
  8. #include<numeric>
  9. using namespace std;
  10. void demo_14()
  11. {
  12. int a=42;
  13. int b=38;
  14. auto c1=[&a,&b]{return a+b;};
  15. cout<<" a+b= "<<c1()<<endl;
  16. }
  17. void demo_15()
  18. {
  19. size_t a=38;
  20. int c=8;
  21. auto d15=[&a](const int &b){return a+b;};
  22. cout<<" a+b= "<<d15(c)<<endl;
  23. a=42;
  24. auto j=d15(c);
  25. cout<<" a+b= "<<d15(c)<<" j= "<<j<<endl;
  26. }
  27. int main()
  28. {
  29. demo_14();
  30. demo_15();
  31. return 0;
  32. }

lambda捕获和返回

当定义一个lambda的时候编译器便生成一个与lambda相应的新的(未命名的)类类型。
当使用auto定义一个用lambda初始化的变量时,定义了一个从lambda生成的类型的对象。

引用捕获

注意这个函数和上面的额不同哦!!

  1. void biggies(vector<string> &words, vector<string>::size_type sz, ostream &os=cout, char c=' ')
  2. {
  3. elimDups(words); //将words按字典顺序排列,删除反复单词
  4. //按长度排序,长度同样的单词维持字典序
  5. stable_sort(words.begin(), words.end(),
  6. [](const string &a, const string &b){return a.size()<b.size();});
  7. //获取一个迭代器,指向第一个满足size()>=sz的元素
  8. auto wc=find_if(words.begin(), words.end(),
  9. [sz](const string &a){return a.size()>=sz;});
  10. //计算满足size>=sz的元素的数目
  11. auto count=words.end()-wc;
  12. cout<<count<<" "<<make_plural(count, "word", "s")
  13. <<" of length "<<sz<<" or longer "<<endl;
  14. //打印长度大于等于给定值的单词,每一个单词后面接一个空格
  15. /*
  16. for_each(wc, words.end(), [](const string &s){cout<<s<<" ";});
  17. cout<<endl;
  18. */
  19. for_each(words.begin(), words.end(), [&os, c](const string &s){os<<s<<c;});
  20. }

PS:看来,这章对我来说好像是有点难的样子,所以我就慢下速度,不囫囵吞枣了。慢慢学。心急吃不了热豆腐。像牛学习,默默努力,不知不觉几亩地就犁完了。

【足迹C++primer】32、定制操作_2的更多相关文章

  1. 【足迹C++primer】32、定制操作_1

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/cutter_point/article/details/32066151 定制操作 向算法传递函数 ...

  2. lambda 表达式定制操作

    泛型算法中的定制操作 许多算法都会比较输入序列中的元素以达到排序的效果,通过定制比较操作,可以控制算法按照编程者的意图工作. 普通排序算法: template<class RandomItera ...

  3. 【足迹C++primer】38、关联容器操作(2)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/cutter_point/article/details/35244805 关联容器操作(2) map ...

  4. 定制操作(传递函数或lambda表达式)

    很多算法都会比较输入序列中的元素.默认情况下,这类算法使用元素类型的<或==运算符完成比较.标准库还为这些算法定义了额外的版本,允许我们提供自己定义的操作来代替默认运算符. 例如,sort算法默 ...

  5. 【足迹C++primer】表达式求值

    表达式求值 /** * 功能:表达式求值(0到9) * 时间:2014年6月15日08:02:31 * 作者:cutter_point */ #include<stdlib.h> #inc ...

  6. 【足迹C++primer】46、动态存储类

    动态存储类 StrVec Class Design StrVec Class Definition class StrVec { public: //构造函数 StrVec():elements(nu ...

  7. 【足迹C++primer】48、函数引用操作符

    函数引用操作符 struct absInt { int operator()(int val) const { cout<<val<<"<->!!!&qu ...

  8. 【足迹C++primer】47、Moving Objects(1)

    Moving Objects(1) * 功能:Moving Objects * 时间:2014年7月17日08:46:45 * 作者:cutter_point */ #include<iostr ...

  9. 【足迹C++primer】49、超载,变化,运营商

    超载,变化,运营商 Conversion Operators 转换操作符 operator type() const Conversions to an array or a function typ ...

随机推荐

  1. python多任务-线程

    目录 多任务的概念 线程基础 单线程执行 多线程执行 主线程会等待所有子线程结束后才结束 查看线程数量 线程-注意点 线程执行代码的封装 线程的执行顺序 总结 多任务的概念 什么叫"多任务& ...

  2. react学习(一)

    组件和属性(props) 函数式组件: function Welcome(props) { return <h1>Hello, {props.name}</h1>; } 渲染一 ...

  3. 关于 Socket 设置 setSoTimeout 误用的说明

    做网络开发的想必对setSoTimeout这个方法很熟悉,知道是设置的超时事件.但是很多人都认为这个是设置链路的超时时间,但是查看相关文档的此方法的说明: HttpConnectionParams: ...

  4. C#DataTable复制、C#DataTable列复制、C#DataTable字段复制

    try { //获取满足条件的数据 DataTable Mdr = datable.Select().ToString("yyyy-MM-dd HH:mm:ss") + " ...

  5. Salesforce 数据备份和恢复小知识

    数据备份的类型 在Salesforce中可以使用多种API进行数据备份,它们是: REST API SOAP API Buik API Metadata API 数据备份有三种选择: 完全备份(Ful ...

  6. codeforces 735C Tennis Championship(贪心+递推)

    Tennis Championship 题目链接:http://codeforces.com/problemset/problem/735/C ——每天在线,欢迎留言谈论. 题目大意: 给你一个 n ...

  7. 智能POS删除文件和数据库操作步骤

    1. 2. 3. 4.winbox:日志:winboxcash:数据库:winboxcyb:其他文件: 5.删除以上三个文件夹

  8. 虚拟机-linux系统中图形界面和命令行界面切换

    linux系统中图形化界面和命令行界面之间的切换可以分为两种,临时性切换和永久性切换. 临时性切换即切换后只对本次生效,系统重启后界面还是默认界面. 永久性切换即切换后系统开机后永远处于的界面. 临时 ...

  9. 表单取消历史保存之autocomplete的用法

    表单取消历史保存之autocomplete的用法 应用场景 浏览器开启了表单自动填充设置后,有些表单中的input元素在添加时会以下拉的形式显示以前填写过的表单,有时候可能会影响用户的使用.比如:da ...

  10. cp 拷贝

    cp -a = cp -pdr p (preserve 保持)  复制时保持文件原有的属性(preserve) 模式 所有权 时间戳 d 连接文件 no dereference 复制时拷备连接文件的属 ...