它的排序算法的一部分,我開始喜歡這個如何模板這種功能?
inline void cmp2(float* a, float* b, int ia, int ib, int &ra, int &rb) {
if (a[ia] > b[ib]) ra++;
else rb++;
}
inline void cmp3(float* a, float* b, float* c, int ia, int ib, int ic, int &ra, int &rb, int &rc) {
if (a[ia] > b[ib]) cmp2(a, c, ia, ic, ra, rc);
else cmp2(b, c, ib, ic, rb, rc);
}
inline void cmp4(float* a, float* b, float* c, float* d, int ia, int ib, int ic, int id, int &ra, int &rb, int &rc, int &rd) {
if (a[ia] > b[ib]) cmp3(a, c, d, ia, ic, id, ra, rc, rd);
else cmp3(b, c, d, ib, ic, id, rb, rc, rd);
}
,然後我想:「但是,嘿,我可以完全做到這一點作爲一個遞歸函數模板」。我開始了
inline void cmp2(float* a, float* b, int ia, int ib, int &ra, int &rb) {
if (a[ia] > b[ib]) ra++;
else rb++;
}
template <int n>
inline void cmp(float** data, int* i, int* r) {
if (data[0][i[0]] > data[1][i[1]]) cmp<n - 1>(??? brain crash
}
我要專門N = 3,直接調用CMP2,其餘去CMP < N - 1>但後來我意識到,我必須創建數據和迭代器的新陣數組每次分裂時都會損害性能。
在我的情況下,n是可變的,可以上升到10,有沒有一種方法來模板化它,就像我手動寫出它並將funcion指針收集到數組中一樣快?
這不是很簡單,那麼你在做什麼?這看起來好像你只是簡單地找到最大值的「索引」(a = 1,b = 2,...)並遞增相應的變量('ra','rb',...) – Amit
,我想這個不好的例子,這不是實際的算法。我試圖簡化它到我能想到的最簡單的事情,同時爲此目的保留問題 – user81993
通過可變參數模板遞歸是非常有用的,當您想要在頭部或尾部拾取一些參數時,以及相同的邏輯應該發生在每個遞歸步驟。它看起來像你的代碼執行有條件的參數傳遞一些非連續的參數序列,所以我不確定可變參數模板是否是最好的方法。如果可能的話,這將是不可讀的,可能需要比您寫的更多的代碼。 – AndyG