zoukankan      html  css  js  c++  java
  • sort回调的简单模拟

    本来是准备讲CPP中的std::sort,但因为最近Java用得多,不知怎么的便习惯性走Java角度看问题了,所以这篇文章看起来估计会有点奇怪...

    一、简单模拟sort回调

    std::sort函数本质上是一个静态回调函数,在回调中属于非常基本的操作,这里就不细讲,我们可以尝试进行模拟实现。

    顺序图以及相应代码:

    main.cpp

    
    #include <cstdio>
    #include <cstdlib>
    #include "main.h"
    
    typedef struct Student {
        int high;
        int weigh;
        int age;
    } Student;
    
    // 排序函数可以自行实现
    bool cmp(Student s1, Student s2) {
        return s1.high < s2.high;
    }
    
    int main() {
        Student s1 = {1, 2, 3};
        Student s2 = {3, 1, 2};
    
        mysort(s1, s2, cmp);
        printf("%d %d %d
    ", s1.high, s1.weigh, s1.age);
        printf("%d %d %d
    ", s2.high, s2.weigh, s2.age);
    
    
        return EXIT_SUCCESS;
    }
    

    main.h

    #ifndef CPROJECT_MAIN_H
    #define CPROJECT_MAIN_H
    
    // sort函数的简单仿写,此处仅实现一次交换
    template<typename RandomAccessor, typename FUNC>
    void mysort(RandomAccessor& first, RandomAccessor& second, FUNC cmp) {
        if (!cmp(first, second)) {
            RandomAccessor temp = first;
            first = second;
            second = temp;
        }
    }
    
    #endif //CPROJECT_MAIN_H
    

    二、存在的问题

    那么静态的回调会产生生什么缺点呢?

    如果sort函数用的多,我们会发现,在面向对象的调用中,一旦回调方法cmp需要调用对象中的某个成员时,由于cmp本身是静态的,它将无法完成调用。

    三、关于改进

    所以我们可以产生一种重写sort的想法:在调用方建立内部类,并给予内部类调用外部类的权限。然后将内部类的实例传递给sort,并回调内部类中cmp方法,如此一来sort便可以很好的基于对象成员完成比较。

    我相信lambda表达式也是基于这个原理实现的。

  • 相关阅读:
    Bootstrap留言板界面练习
    Bootstrap 学习
    web | [GXYCTF2019]禁止套娃
    re | [GKCTF2020]WannaReverse
    PE文件结构 | 在PE文件的空白区添加代码
    PE文件结构 | RVA与FOA的转换
    re | [NPUCTF2020]BasicASM
    win32 | WinSock2网络编程 | socket-tcp通信
    web | flask 修饰器实现原理
    运维 | 配置LNMP | 基于docker.ubuntu:16.04
  • 原文地址:https://www.cnblogs.com/zzzz76/p/13939695.html
Copyright © 2011-2022 走看看