2017-10-17 70 views
2

所以我想要做的是讓函數分析算法,包括它們的交換和比較次數,現在我面臨的問題是我需要重用這個函數,但爲了分析我需要調用每個算法函數的算法。有沒有辦法替換C++中的方法中的函數

下面是函數的代碼:

bool flag = false; 
    for (int i = 0; i < 6; i++) 
    { 
     if (!flag) 
     { 
      selectionSort(bigArray[i], 100); 
      printData(fileNames[i],swaps,comparisons); 
      comparisons = 0; 
      swaps = 0; 
      flag = true; 
     } 
     else 
     { 
      selectionSort(bigArray[i], 1000); 
      printData(fileNames[i],swaps,comparisons); 
      comparisons = 0; 
      swaps = 0; 
      flag = false; 
     } 
    } 

現在你看到選擇排序是我需要來取代它,以插入,快速,堆,合併計算。我可以在main中重複編寫代碼並替換排序函數,但我認爲應該有某種解決方案來完成此操作。我只是無法找到它,我曾想過創建一個函數,將另一個函數作爲參數,但是再一次,其中一些算法函數需要2個其他3個函數,並且在執行此操作時,您不能只執行void analyzeAlgorithms(void (*function)(int*, int, int, int x = 0)).任何幫助將不勝感激在此先感謝

+0

爲什麼你不能使用函數指針?如果你的問題是你的一些函數需要兩個,一些需要三個參數,你可以使第三個參數是可選的,並在需要時忽略它。 – Alex

+0

另一種選擇是使函數具有可變參數模板參數包,並將其轉發給匹配的'std :: function'參數。 – user0042

+0

@Alex如果我使用指針函數,正如我所說的一些算法需要2或3個。 C++編譯迫使你實現參數\t函數(bigArray [i],100,????????)。 –

回答

2

可以在拍攝參數可變參數集合函數模板內包裝你的代碼,並轉發上匹配Fn可調用的參數(我省略了一些無關緊要的東西):

#include <iostream> 

template<typename Fn, typename ...Args> 
void sort_tester(Fn sortfunc, Args... args) { 
    int bigArray[] {1,2,3,4,5,6}; 
    bool flag = false; 
    for (int i = 0; i < 6; i++) { 
     int n = flag ? 1000 : 100; 
     sortfunc(bigArray[i],n,args...); 
     flag = !flag; 
    } 
} 

void selectionSort(int elem, int n) { 
    std::cout << "selectionSort(" << elem << ',' << n << ")\n"; 
    // Do stuff ... 
} 

void mergeSort(int elem, int n, int extraParam) { 
    std::cout << "mergeSort(" << elem << ',' << n << ',' << extraParam << ")\n"; 
    // Do stuff ... 
} 

這可以如下使用:

int main() { 
    sort_tester(selectionSort); 

    sort_tester(mergeSort,42); 
} 

查看live example

+1

我可以推薦不使用'std :: function',而只是一個普通的模板參數嗎?現在它需要'Args'完美匹配參數,不允許轉換。如果用簡單的模板參數替換'std :: function <...>',轉換就會發生,並且可能會更輕。 –

+0

'std :: function'爲你提供類型執行(根據你的用例可以是好的或壞的),但它也給你額外的間接和堆分配。 – caps

+0

@GuillaumeRacicot感謝您的建議。我現在使用普通模板參數而不是'std :: function'簡化了我的代碼示例。 – user0042

1

有你的函數的簽名會有所幫助,所以我會假設變量類型和參數。如果您希望獲得更完整的解決方案,請編輯您的問題以添加實際相關數據來解決您的問題。

您可以通過函數來​​替換參數。

template<typename F> 
void yourAlgorithm(char const** fileNames, int** bigArray, F function) { 
    bool flag = false; 
    for (int i = 0; i < 6; i++) 
    { 
     if (!flag) 
     { 
      function(bigArray[i], 100); 
      printData(fileNames[i],swaps,comparisons); 
      comparisons = 0; 
      swaps = 0; 
      flag = true; 
     } 
     else 
     { 
      function(bigArray[i], 1000); 
      printData(fileNames[i],swaps,comparisons); 
      comparisons = 0; 
      swaps = 0; 
      flag = false; 
     } 
    } 
} 

當調用它,你可以通過一個函數或拉姆達:

int n = 2; 
yourAlgorithm(fileNames, bigArray, selectionSort); 
yourAlgorithm(fileNames, bigArray, mergeSort); 
yourAlgorithm(fileNames, bigArray, [n](int* a, int x){ /* do stuff with a, b and n */ }); 
+0

據我所知,OP的問題是如何用不同數量的參數調用排序算法(函數)。這需要暗示可變參數包IMO。 – user0042

+0

@Guillaume Racicot你在參數點(:。但是user0042是正確的,該函數用於不同數量的參數。 –

+0

我喜歡在這裏使用模板的模板,但是指向'char *'和一個指向'int *'的指針並不是非常乾淨的方式來傳遞數組引用... – caps

相關問題