泛型算法中的定制操作

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

  • 普通排序算法:
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. .net中对HTTP请求的两种请求:Get和Post的操作

    .net中对HTTP请求的简单操作总结 第一部分,HTTP协议的简单了解 一.           什么是HTTP协议 超文本传输协议 (HTTP-Hypertext transfer protoco ...

  2. Browser

    浏览器中关于事件的那点事儿 作者: 顽Shi  发布时间: 2014-02-01 20:22  阅读: 7830 次  推荐: 25   原文链接   [收藏]   摘要:事件在Web前端领域有很重要 ...

  3. 第十三课 Actionlib(2)

    上节课讲到了客户端,这节课讲解一下服务器 1.创建服务器源文件touch fibonacciserver.cpp 2.编写源文件 3.修改CMakeLists.txt 4.编译之catkin_make ...

  4. 如何偷Android的内存-Tricking Android MemoryFile

    之前在做一个内存优化的时候,使用到了MemoryFile,由此发现了MemoryFile的一些特性以及一个非常trickly的使用方法,因此在这里记录一下 What is it MemoryFile是 ...

  5. [GO]给导入包起别名

    package main import io "fmt" //引用fmt这个包时,名字重命名为io import _ "os" //引用os这个包,但是不调用, ...

  6. 【2008nmj】GDA二元分类.docx

  7. delphi TString使用(取有规律的字符串中某一项内容)

    {目的,取得下面字符串中的每一项内容,如s:='a,b,c,d',要去的用逗号隔开的每一项内容这时采用Tstring,会方便很多,TString是继承TStringList带有List所有属性.} v ...

  8. android library使用方法

    一.Android library使用情景 通用模块的重复使用,项目做多了,其实都是差不多,核心模块基本无需大的改动,需要改的只是核心模块上的业务功能而已. Java中可以打包成库,或者说,单纯的ja ...

  9. 【转】Android android listview的HeadView左右切换图片(仿新浪,网易,百度等切换图片)

    首先我们还是看一些示例:(网易,新浪,百度)      下面我简单的介绍下实现方法:其实就是listview addHeaderView.只不过这个view是一个可以切换图片的view,至于这个vie ...

  10. vs2015+opencv3.3.1 +Eigen 3.3.4 c++ 实现 泊松图像编辑(无缝融合)

    #define EIGEN_USE_MKL_ALL #define EIGEN_VECTORIZE_SSE4_2 #include <iostream> #include "co ...