2016-02-03 98 views
0

它的排序算法的一部分,我開始喜歡這個如何模板這種功能?

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指針收集到數組中一樣快?

+0

這不是很簡單,那麼你在做什麼?這看起來好像你只是簡單地找到最大值的「索引」(a = 1,b = 2,...)並遞增相應的變量('ra','rb',...) – Amit

+0

,我想這個不好的例子,這不是實際的算法。我試圖簡化它到我能想到的最簡單的事情,同時爲此目的保留問題 – user81993

+0

通過可變參數模板遞歸是非常有用的,當您想要在頭部或尾部拾取一些參數時,以及相同的邏輯應該發生在每個遞歸步驟。它看起來像你的代碼執行有條件的參數傳遞一些非連續的參數序列,所以我不確定可變參數模板是否是最好的方法。如果可能的話,這將是不可讀的,可能需要比您寫的更多的代碼。 – AndyG

回答

0

您可以使用可變參數模板(需要C++ 11)。

打印(僅字符串)例如:

#include <iostream> 

void print(const std::string& s) 
{ 
    std::cout << s << std::endl; 
} 

template<typename... Args> 
void print(const std::string& s, Args... args) 
{ 
    std::cout << s; 
    print(args...); 
} 

int main() 
{ 
    print("a", "c", "b"); 
    return 0; 
} 

您將解壓2個指針+指數,做你的比較,並進一步通過第二和剩下的參數,直到你到達尾部,其你CMP2 。

+1

您是否介意如何應用可變模板來修改OP的功能,而不是僅僅提到語言功能的存在? –