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表達式也是基於這個原理實現的。