有没有办法在c ++中替换方法中的函数

时间:2017-10-17 21:10:13

标签: c++ algorithm

所以我要做的是制作分析算法的函数,包括交换和比较的数量,现在我面临的问题是我需要重用这个函数但是为了分析我需要的算法调用每个算法函数。

以下是该函数的代码:

    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;
        }
    } 

现在你看到selectionSort在哪里我将需要替换它,包括插入,快速,堆,合并,计数。我可以在main中反复编写代码并替换排序函数,但我认为应该有一些解决方案来实现这一点。我只是找不到它,我想到制作一个将另一个函数作为参数的函数,但是再一次,一些算法函数需要另外两个3,并且当这样做时你不能只做{{1任何帮助都会提前感谢

2 个答案:

答案 0 :(得分: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 :(得分: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;
        }
    }
}

调用它时,可以传递函数或lambda:

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 */ });