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