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\n", s1.high, s1.weigh, s1.age);
    printf("%d %d %d\n", 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表达式也是基于这个原理实现的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值