本來是準備講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表示式也是基於這個原理實現的。