泛型算法中的定制操作

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

  • 普通排序算法:
template<class RandomIterator>
void sort(RandomIterator first,RandomIterator last){if(first >= last || first + 1 == last)return;if(last - first <= 20) return bubble_sort(first,last,pred);auto mid = mid3(first,last-1,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-2));  //what is sort ?
    sort(first,p1,pred);sort(p1+1,last,pred);
}

  • 排序算法的定制操作

排序算法只能由小到大。

二排序算法的定制操作,多了一个类型BinaryPredicate,可以用来定制规则。

template<class RandomIterator,class BinaryPredicate>
void sort(RandomIterator first,RandomIterator last,BinaryPredicate){if(first >= last || first + 1 == last)return;if(last - first <= 20)return bubble_sort(first,last,pred);auto mid = mid3(first,last,pred);auto p1 = first, p2 = last - 2;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-2));sort(first,p1,pred);sort(p1+1,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;
}

---------------------------------------------------------------------------------------------------------------------

实验楼出品

转载于:https://www.cnblogs.com/wanghao-boke/p/10491284.html

lambda 表达式定制操作相关推荐

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

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

  2. java 8 lambda表达式list操作分组、过滤、求和、最值、排序、去重

    java8的lambda表达式提供了一些方便list操作的方法,主要涵盖分组.过滤.求和.最值.排序.去重.跟之前的传统写法对比,能少写不少代码. 新建实体类 package com.vvvtimes ...

  3. Java 8 Lambda 表达式Stream操作

    在jdk1.8新的stream包中针对集合的操作也提供了并行操作流和串行操作流.并行流就是把内容切割成多个数据块,并且使用多个线程分别处理每个数据块的内容. 优点: Stream API可以极大提高J ...

  4. C++11中的Lambda表达式

    本文地址:http://www.cnblogs.com/archimedes/p/c11-lambda.html,转载请注明源地址. "Lambda 表达式"(lambda exp ...

  5. java8 lambda python_【学习笔记】java8 Lambda表达式语法及应用

    本文是慕课网大牧莫邪老师的视频教程一课掌握Lambda表达式语法及应用的学习笔记.如果觉得内容对你有用,可以购买老师的课程支持一下,课程价格1元,十分良心了. 1. 课程介绍 2. 为什么引入Lamb ...

  6. 1.1 lambda表达式

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

  7. lamda获取参数集合去空_(转)Java8使用lambda表达式进行集合的遍历

    本文转自 我们经常会用到各种集合,数字的,字符串的还有对象的.它们无处不在,哪怕操作集合的代码要能稍微优化一点,都能让代码清晰很多.在这章中,我们探索下如何使用lambda表达式来操作集合.我们用它来 ...

  8. Java讲课笔记17:Lambda表达式

    文章目录 零.本讲学习目标 1.理解Lambda表达式的作用 2.掌握Lambda表达式的操作(遍历.过滤.提取) 一.Lambda表达式入门 1.匿名内部类的缺点 2.JDK1.8提供的解决方案 3 ...

  9. lambda 对象去重_采用java8 lambda表达式 实现 java list 交集 并集 差集 去重复并集...

    采用java8 lambda表达式 实现java list 交集/并集/差集/去重并集 一般的javaList 交.并集采用简单的 removeAll retainAll 等操作,不过这也破坏了原始的 ...

最新文章

  1. 团队-科学计算器-模块测试过程
  2. 以列表形式输出_python格式化输出总结
  3. 阿里云开源的Blink,计算能力很疯狂:一眨眼,全部都算好!
  4. 软件架构(7)---软件架构设计-五视图方法论
  5. 通过命令行编译器来编译运行程序
  6. 使用JDK中的 keytool【创建证书】・【查看】・【使用】
  7. 但是在公司开空调睡觉还是冷
  8. tab点击一个按钮切换排序_Axure8原型教程:实现Tab选项切换
  9. 怎么用python编写个apk_python自动安装apk文件
  10. Ubuntu20.04安装过程 【磁盘分区】
  11. php同步登录,UCenter单点登录/同步登录/同步登出实例_PHP教程
  12. 整理wind商誉数据2016-2019
  13. 乐观的态度使工作充满激情
  14. 沐阳从0到1零基础学习安卓逆向
  15. joint_state_publisher_gui
  16. 系统调优之四大天王——快来瞧瞧~
  17. Linux管道初步了解
  18. 关于LAMMPS能量最小化
  19. CSDN 富文本编辑器和 Markdown 编辑器使用 Word 支持的 LaTx 语法公式
  20. USB运动控制 (五轴雕刻机系统)全部开源 不保留任何关键技术

热门文章

  1. C++ namespace
  2. 要想能安心,必须先死心。
  3. Struts2初始化流程及源码分析
  4. android 如何extends 多个,Android多线程:继承Thread类 使用解析(含实例教程)
  5. 服务器如何查看gpu型号,linux 查看服务器gpu
  6. 更改mysql数据库存放位置_更改mysql数据库存放位置
  7. js实现oss批量下载文件_js下载文件到本地各种方法总结
  8. android studio gradle 学习,学习Android Studio里的Gradle
  9. c# 口口乱码_c# 乱码解决方法
  10. 县级的图书馆计算机管理员,图书馆管理员的岗位职责