本来是准备讲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表达式也是基于这个原理实现的。