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

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

定制操作

向算法传递函数

用 sort 接受第三个參数!!

谓词

bool isShorter(const string &s1, const string &s2)
{
return s1.size()<s2.size();
} int main()
{
//按长度由短至长排序words
sort(words.begin(), words.end(), isShorter);
}

这个words里面是一个string类型的数组,这个调用会是将words重排,全部长度为3的单词排在长度为4的前面,然后是长度为5的单词。

排序算法

看来排序非常重要啊!

近期老碰到排序。冒泡排序什么的已经非常熟悉啦,选择排序不太清楚,什么二分啦,快排啦,哈希啦。就仅仅是知道思路,得努力啊!

!

!

    vector<string> words={"fox","jumps","over","quick","red","red","slow","the","the","turtle"};
//按长度由短至长排序words
sort(words.begin(), words.end(), isShorter);
elimDups(words); //将words按字典序重排,并消除反复单词
//按长度重排。长度一样按字典
stable_sort(words.begin(), words.end(), isShorter); for(const auto &s : words) //无需拷贝字符串
cout<<s<<" "; //打印每一个元素
cout<<endl;

习题:

//调用算法进行排序打印长度大于5的元素
auto it=partition(words.begin(), words.end(), isLong);
//返回的是使谓词为true的最后一个迭代器
cout<<"输出长度大于等于5的字符! ! "<<endl;
for(vector<string>::iterator st=words.begin() ; st != it ; ++st)
cout<<*st<<" ";
cout<<endl;

lambda表达式

要是没次要输出大于几就改有点麻烦是吧,那就把谓词给它来个百八十个!

!!

获取一个迭代器,指向第一个满足size()>=sz的元素
计算满足size>=sz的元素的数目
打印长度大于给定值的单词,每一个单词后面接一个空格
这里能够用find_if。嘿嘿!

!

又来了好东西了。大家是不是感觉幸福来的太突然!!!

find_if接受一对迭代器,表示一个范围,查找有特定大小的元素。

但是啊,这里find_if每次也仅仅能接受一个參数,没法接受一个序列!

!

!

!

这么办呢???

介绍lambda

眼下就两种可调用对象。各自是:函数、函数指针!!。函数指针是干嘛的?
事实上还有两种:重载了函数调用运算符的类,和 嘿嘿,又来了,每次揭晓答案的时候总是忍不住调皮一下
那就是:lambda表达式
[capture list] (parameter list)  -> return type{function body}
诺,这就是那玩意的表现形式。
//是不是有点不一样。这里定义了可调用对象f,它不接受參数。返回42
auto f=[] {return 42;};

    //看哥调用它
cout<<f()<<endl;

这里假设lambda的函数体包括不论什么单一return语句之外的内容、且为指定返回类型。则返回void类型

向lambda传递參数,使用捕获列表

stable_sort(words.begin(), words.end(), [] (const string &a, const string &b)
{return a.size()<b.size();})

void fcn1()
{
vector<string> words={"fox","jumps","over","quick","red","red","slow","the","the","turtle"};
size_t v1 = 42;
//获取一个迭代器,指向第一个满足size()>=v1的元素
auto wc=find_if(words.begin(), words.end(), [v1](const string &a){return a.size()>=v1;}); }

void fcn2()
{
vector<string> words={"fox","jumps","over","quick","red","red","slow","the","the","turtle"};
size_t v1 = 42;
//获取一个迭代器。指向第一个满足size()>=v1的元素
auto wc=find_if(words.begin(), words.end(), [v1](const string &a){return a.size()>=v1;});
//计算满足size>=sz的元素的数目
auto count=words.end()-wc; cout<<count<<" "<<make_plural(count, "word", "s")
<<" of length "<<v1<<" or longer "<<endl; //for_each算法
for_each(wc, words.end(),[](const string &s){cout<<s<<" yeah! ";});
}

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

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

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/cutter_point/article/details/32301839 定制操作_2 完整的big ...

  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. TCP/IP 网络编程(五)

    优于 select 的 epoll (I/O 复用) select 速度慢的原因 调用select后针对全部文件描写叙述符的循环 每次调用函数时都须要向该函数传递监视对象信息 select并非把发生变 ...

  2. js 导入json配置文件

    import AA from './menu.json' console.log(AA) 匹配好路径

  3. 【Excle】科学计数法快速还原

    在Excle的单元格中,如果输入大于11位的数字,结果就会以E+形式显示 如果是单个输入的话,只需要把Excle中的单元格格式设置为文本即可,然后输入就不会出现科学计数法,但是有时候是从外部导入的序号 ...

  4. Android 关于SD的操作

    1 http://www.cnblogs.com/shaoyangjiang/archive/2012/03/09/2388178.html 2

  5. 在Linux平台使用VNC连接树莓派

    你的Linux发行版本号可能已经包括了Remote Desktop Viewer(远程桌面)程序.你能够通过这个程序使用VNC连接你的树莓派.通常能够在Applications/Internet菜单以 ...

  6. 【CODEFORCES】 A. Initial Bet

    A. Initial Bet time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  7. uboot和内核分区的改动

    随着内核的更新,内核越来越大,uboot给nand的kernel分区默认是2M的 device nand0 <nandflash0>, # parts = 4  #: name       ...

  8. IOS开发——Core Graphics &amp; Core Animation

    好久没写过blog了.首先了解下近期苹果和IOS方面的最新消息. 1.WWDC2014在上个月举行了,与2013年一样.今年WWDC没公布硬件产品和新品(假设你懂cook你就会期待今年秋季公布会.估计 ...

  9. es6/es7 对象数组的合并拷贝

    方法一: let o1 = { a: 1, b: 2, c: 3 }; let o2 = {...o1, d: 4}; // o2 = { a: 1, b: 2, c: 3, d: 4 } let a ...

  10. SpringBoot项目的云服务器部署

    1.场景还原 springboot配置相当简单,人人皆知.怎么把springboot工程部署到云服务器上呢?可能有人会说,博主你前篇不是讲了java工程的云部署把:但是我想澄清一点的是,我前篇的工程都 ...