泛型算法中的定制操作

许多算法都会比较输入序列中的元素以达到排序的效果,通过定制比较操作,可以控制算法按照编程者的意图工作。

  • 普通排序算法:
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 表达式定制操作的更多相关文章

  1. Util应用程序框架公共操作类(十二):Lambda表达式公共操作类(三)

    今天在开发一个简单查询时,发现我的Lambda操作类的GetValue方法无法正确获取枚举类型值,以至查询结果错误. 我增加了几个单元测试来捕获错误,代码如下. /// <summary> ...

  2. Util应用程序框架公共操作类(八):Lambda表达式公共操作类(二)

    前面介绍了查询的基础扩展,下面准备给大家介绍一些有用的查询封装手法,比如对日期范围查询,数值范围查询的封装等,为了支持这些功能,需要增强公共操作类. Lambda表达式公共操作类,我在前面已经简单介绍 ...

  3. Util应用程序框架公共操作类(七):Lambda表达式公共操作类

    前一篇扩展了两个常用验证方法,本文将封装两个Lambda表达式操作,用来为下一篇的查询扩展服务. Lambda表达式是一种简洁的匿名函数语法,可以用它将方法作为委托参数传递.在Linq中,大量使用La ...

  4. Lambda表达式-聚合操作

    文章参考自博客:https://www.cnblogs.com/franson-2016/p/5593080.html 以及学习网站:how2java.cn 1.传统方式和聚合操作遍历数据的不同 传统 ...

  5. sort 及lambda表达式定制排序

    void CDrawCircle::OnBnClickedBtnSelectinfo() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); BeginEditor ...

  6. Util应用程序框架公共操作类(九):Lambda表达式扩展

    上一篇对Lambda表达式公共操作类进行了一些增强,本篇使用扩展方法对Lambda表达式进行扩展. 修改Util项目的Extensions.Expression.cs文件,代码如下. using Sy ...

  7. 1.1 lambda表达式

    一.处理匿名内部类 1.Runnable接口 new Thread(new Runnable() { public void run() { System.out.println("hell ...

  8. java8的lambda表达式,将List<DTO> 转为 List<DO>

    将List<PhoneDTO>转为List<PhoneDO>,通过java8的lambda表达式来操作,比传统的for循环精简很多: /** * List<PhoneDT ...

  9. Java中lambda表达式详解

    原文地址:http://blog.laofu.online/2018/04/20/java-lambda/ 为什么使用lambda 在java中我们很容易将一个变量赋值,比如int a =0;int ...

随机推荐

  1. 重命名Docker容器

    重命名Docker容器: Docker rename [Old container name]  [New container name]

  2. 3、python的传入参数

    转载:https://blog.csdn.net/abc_12366/article/details/79627263 1.位置参数: def func(a, b): print(a+b) func( ...

  3. Servlet请求转发 RequestDispatcher接口.RP

    在Servlet中,利用RequestDispatcher对象,可以将请求转发给另外一个Servlet或JSP页面,甚至是HTML页面,来处理对请求的响应. 一,RequestDispatcher接口 ...

  4. Eclipse中新建applet 错误

    出现的问题:  “错误,请单击以获取详细信息” Java Plug-in 1.6.0_45 使用 JRE 版本 1.6.0_45-b06 Java HotSpot(TM) Client VM 用户主目 ...

  5. PROC程序设计

    通过在过程化编程语言中嵌入SQL语句而开发出的应用程序称为Pro程序. 在C/C++语言中嵌入SQL语句而开发出的应用程序称为Pro*C/C++程序. –在通用编程语言中使用的SQL称为嵌入式SQL: ...

  6. 编写高质量代码改善C#程序的157个建议——建议27:在查询中使用Lambda表达式

    建议27:在查询中使用Lambda表达式 LINQ实际上是基于扩展方法和Lambda表达式的.任何LINQ查询都能通过扩展方法的方式来代替. var personWithCompanyList = f ...

  7. 团队项目第六周-Alpha阶段项目复审(深海划水队)

    经小组讨论后得出以下排名: 队名 优点 缺点 排名 大猪蹄子队 界面优美,功能简洁易懂,单词解释较为完善 互动方式.操作简易性有待优化,有部分功能尚未完成 1 Running Duck队 基本功能已经 ...

  8. 【Thread】线程工厂-ThreadFactory

    ThreadFactory---线程工厂 在apollo源码中有这么一段代码 ExecutorService m_longPollingService = Executors.newSingleThr ...

  9. 解决tomcat启动 startup.bat的时候一闪而过(就是java环境变量的配置)

    系统变量配置:(解决tomcat启动 startup.bat的时候一闪而过) JAVA_HOME C:\Program Files (x86)\Java\jdk1.7.0_25 =========== ...

  10. SDUT OJ 数据结构实验之链表四:有序链表的归并

    数据结构实验之链表四:有序链表的归并 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Desc ...