lambda 表达式定制操作
泛型算法中的定制操作
许多算法都会比较输入序列中的元素以达到排序的效果,通过定制比较操作,可以控制算法按照编程者的意图工作。
- 普通排序算法:
template<class RandomIterator>
void sort(RandomIterator first,RandomIterator last){
if(first >= last || first + == last)
return;
if(last - first <= )
return bubble_sort(first,last,pred);
auto mid = mid3(first,last-,pred); //mid3 is unknow,is a function for calculating the mid?
while(p1 < p2){
while(pred(*p1,mid)&&(p1<p2)) ++p1;
while(!pred(*p2,mid)&&(p1<p2)) --p2;
if(p1 < p2){
swap(*p1,*p2);
}
}
swap(*p1,*(last-)); //what is sort ?
sort(first,p1,pred);
sort(p1+,last,pred);
}
- 排序算法的定制操作
排序算法只能由小到大。
二排序算法的定制操作,多了一个类型BinaryPredicate,可以用来定制规则。
template<class RandomIterator,class BinaryPredicate>
void sort(RandomIterator first,RandomIterator last,BinaryPredicate){
if(first >= last || first + == last)
return;
if(last - first <= )
return bubble_sort(first,last,pred);
auto mid = mid3(first,last,pred);
auto p1 = first, p2 = last - ;
while(p1 < p2){
while(pred(*p1,mid) && (p1 < p2)) ++p1;
while(!pred(*p1,mid) && (p1 < p2)) --p2;
if(p1 < p2){
swap(*p1,*p2);
}
}
swap(*p1,*(last-));
sort(first,p1,pred);
sort(p1+,last,pred);
}
谓词:相当于一个动作,比如一个需求,希望从大到小,则可以先定义一个谓词(函数)
bool cmp(const int& v1,const int &v2){
return v1 > v2;
}
sort(v.begin(),v.end(),cmp);
将该函数传递给sort算法时,就可以从小到大排序了。
lambda表达式:
在前面的例子中,定义了一个函数传递给sort算法,这个函数可以重复使用还好,如果使用一次的话就很麻烦。
这种情况下lambda就可以用上了,它相当于谓语,没有定义函数。
sort(v.begin(),v.end(),[]cmp(const int& int v1,const int& v2){
return v1 > v2;
}
---------------------------------------------------------------------------------------------------------------------
实验楼出品
lambda 表达式定制操作的更多相关文章
- Util应用程序框架公共操作类(十二):Lambda表达式公共操作类(三)
今天在开发一个简单查询时,发现我的Lambda操作类的GetValue方法无法正确获取枚举类型值,以至查询结果错误. 我增加了几个单元测试来捕获错误,代码如下. /// <summary> ...
- Util应用程序框架公共操作类(八):Lambda表达式公共操作类(二)
前面介绍了查询的基础扩展,下面准备给大家介绍一些有用的查询封装手法,比如对日期范围查询,数值范围查询的封装等,为了支持这些功能,需要增强公共操作类. Lambda表达式公共操作类,我在前面已经简单介绍 ...
- Util应用程序框架公共操作类(七):Lambda表达式公共操作类
前一篇扩展了两个常用验证方法,本文将封装两个Lambda表达式操作,用来为下一篇的查询扩展服务. Lambda表达式是一种简洁的匿名函数语法,可以用它将方法作为委托参数传递.在Linq中,大量使用La ...
- Lambda表达式-聚合操作
文章参考自博客:https://www.cnblogs.com/franson-2016/p/5593080.html 以及学习网站:how2java.cn 1.传统方式和聚合操作遍历数据的不同 传统 ...
- sort 及lambda表达式定制排序
void CDrawCircle::OnBnClickedBtnSelectinfo() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); BeginEditor ...
- Util应用程序框架公共操作类(九):Lambda表达式扩展
上一篇对Lambda表达式公共操作类进行了一些增强,本篇使用扩展方法对Lambda表达式进行扩展. 修改Util项目的Extensions.Expression.cs文件,代码如下. using Sy ...
- 1.1 lambda表达式
一.处理匿名内部类 1.Runnable接口 new Thread(new Runnable() { public void run() { System.out.println("hell ...
- java8的lambda表达式,将List<DTO> 转为 List<DO>
将List<PhoneDTO>转为List<PhoneDO>,通过java8的lambda表达式来操作,比传统的for循环精简很多: /** * List<PhoneDT ...
- Java中lambda表达式详解
原文地址:http://blog.laofu.online/2018/04/20/java-lambda/ 为什么使用lambda 在java中我们很容易将一个变量赋值,比如int a =0;int ...
随机推荐
- 项目二:品优购 第二天 AngularJS使用 brand商品页面的增删改查
品优购电商系统开发 第2章 品牌管理 传智播客.黑马程序员 1.前端框架AngularJS入门 1.1 AngularJS简介 AngularJS 诞生于2009年,由Misko Hevery 等人 ...
- ubuntu14.04 安装PCL
博客转自:https://blog.csdn.net/dwj6336736/article/details/76674018 系统安装 sudo add-apt-repository ppa:v-la ...
- WEB前端--JavaScript
JavaScript JavaScript基础 一.JavaScript简介 JavaScript是一种嵌入到HTML文件中的描述性语言,由浏览器的解释器将其动态地处理成可执行的代码,能独立地完成与客 ...
- eclipse——执行Maven命令
右键pom.xml文件 点击 m2 Maven build... 输入要执行的命令,点击Run 控制台会打印maven运行过程
- VMware下Ubuntu虚拟机NAT模式 连接Xshell
1.Edit->Virtual NetWork Editor 2.选择NAT->NAT Settings 配置端口映射关系 很重要! Host port: 真实主机 一般是Windows端 ...
- css总结11:css的overflow问题
1 排版时经常遇到块级元素内容overflow,怎么妥当处理是一个关键. overflow的常用属性: 代码: <!DOCTYPE html><html lang="en ...
- HttpUploader2 -chrome 45+安装教程
HttpUploader2-Chrome 45+安装说明 步骤如下: a.先安装HttpUploader2.exe,HttpUploader2.exe为插件集成安装包. b.再安装HttpUpload ...
- C#序列化xml,开发常用
序列化操作对于开发人员来说最熟悉不过了. 序列化分为:序列化和反序列化. 序列化名词解释:序列化是将对象状态转换为可保持或传输的格式的过程. 与序列化相对的是反序列化,它将流转换为对象.这两个过程结合 ...
- Unity破解不成功解决方案
你是不是遇到过Unity新版本出来的时候就急着使用,但是安装好了,却破解不成功的问题(你之前的版本破解过).这是由于你的注册表没有彻底的删除,接下来我们图解如何清理. 1.卸载以前的版本,卸载完了删除 ...
- 编写高质量代码改善C#程序的157个建议——建议16:元素数量可变的情况下不应使用数组
建议16:元素数量可变的情况下不应使用数组 在C#中,数组一旦被创建,长度就不能改变.如果我们需要一个动态且可变长度的集合,就应该使用ArrayList或List<T>来创建. 而数组本身 ...