C++:将函数从一个函数传递到另一个函数

标签 c++ function parameters

我正在尝试实现一种快速排序算法,以根据 4 个不同的标准之一对填充了“电影”类型对象的数组进行排序。每个电影对象都包含一个排名、票数、评级和电影名称。我还在类定义中编写了 4 个静态 bool 函数,它们接受两个电影对象引用,如果第一个较小则返回 true,如果较大则返回 false。

例如:

bool Movie::GetLowerRank(const Movie& x, const Movie& y){
    if (x.rank < y.rank)
        return true;
    else
        return false;
}  

就像我说的,我正在尝试实现一种快速排序算法,该算法将根据用户偏好对数组进行排序。我想将我的 4 个排序函数之一传递给我的快速排序函数,类似于 vector 排序的工作方式。我的问题是我有两个快速排序函数,递归函数和基函数:

void quickSort(Movie array[], int min, int max, bool (*compare_function)(Movie&, Movie&)){
    if (min < max) {
        int pivot_i = (min + max)/2;
        int pivot_i2 = quickSort(array, min, max, pivot_i, compare_function);
        quickSort(array, min, pivot_i2 - 1);
        quickSort(array, pivot_i2 +1, max);
    }   
}

int quickSort(Movie array[], int min, int max, int pivot, bool (*compare_function)(Movie& a, Movie& b)){
    Movie pivot_entry = array[pivot];
    swap (array[pivot], array[max]);
    int pivot_final_index = min;
    for (int i = min; i < max; i++) {
        if(compare_function(array[i], pivot_entry)){
            swap(array[i], array[pivot_final_index]);
            ++pivot_final_index;
        }
    }
    swap(array[max], array[pivot_final_index]);
    return pivot_final_index;
}

我试图将函数参数添加到参数列表中,但我无法弄清楚如何让 void quickSort 将函数(在 main 中获得)传递给实际使用它的 int quickSort。

最佳答案

首先将GetLowerRank简化为

bool Movie::GetLowerRank(const Movie& x, const Movie& y) {
    return x.rank < y.rank;
}

compare_function 只是作为最后一个参数传递给 quickSort。由于 void quickSort(...) 调用 int quickSort(...),您必须首先声明或定义 int quickSort(),类(class)。否则 void quickSort() 会尝试调用自身并提示参数数量不匹配

int quickSort(Movie array[], int min, int max, int pivot, bool (*compare_function)(Movie& a, Movie& b)){
    Movie pivot_entry = array[pivot];
    swap (array[pivot], array[max]);
    int pivot_final_index = min;
    for (int i = min; i < max; i++) {
        if(compare_function(array[i], pivot_entry)){
            swap(array[i], array[pivot_final_index]);
            ++pivot_final_index;
        }
    }
    swap(array[max], array[pivot_final_index]);
    return pivot_final_index;
}

void quickSort(Movie array[], int min, int max, bool (*compare_function)(Movie&, Movie&)){
    if (min < max) {
        int pivot_i = (min + max)/2;
        int pivot_i2 = quickSort(array, min, max, pivot_i, compare_function);
        quickSort(array, min, pivot_i2 - 1, compare_function);
        quickSort(array, pivot_i2 +1, max, compare_function);
    }   
}

关于C++:将函数从一个函数传递到另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16428539/

相关文章:

c++ - 是否可以使用单独的线程来读取和写入 Boost.Asio?

c++ - 如何通过接口(interface)将仿函数分配给函数对象?

javascript - 更改函数以接受多个参数

ruby - Sinatra 的多个 block 参数

Haskell:将参数组合成元组而不是使用不同的参数有什么含义?

c++ - 在 C++ 中打印错误的 mltiplication 值

c++ - 如何打印结构 vector ?是不是没有保存数据?

sql - 参数化查询 Visual Basic

c++ - 如何将 byte[] 放入 capnp::Data

在 C 中调用以字符串变量命名的函数