sort回撥的簡單模擬

小z同學發表於2020-11-07

本來是準備講CPP中的std::sort,但因為最近Java用得多,不知怎麼的便習慣性走Java角度看問題了,所以這篇文章看起來估計會有點奇怪...

一、簡單模擬sort回撥

std::sort函式本質上是一個靜態回撥函式,在回撥中屬於非常基本的操作,這裡就不細講,我們可以嘗試進行模擬實現。

順序圖以及相應程式碼:

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便可以很好的基於物件成員完成比較。

sort回撥的簡單模擬

我相信lambda表示式也是基於這個原理實現的。

相關文章