C ++-我的模板函数是否由于错误的谓词设计而失败?

问题描述 投票:0回答:1

我正在尝试实现一个函数,该函数可以为我的学校作业查找C中任何给定的数组,向量或C ++中名为set_max的集合的最大值。使用该函数看起来像这样(pred_int是谓词):

int arr_int[] = { 1, 3, 5, 7, 4, 6, 9, 2, 0 };
int main(){
  const int* maxint = find_max( &arr_int[0],
    &arr_int[sizeof(arr_int)/sizeof(*arr_int)], pred_int);
  std::cout <<*maxint <<"\n";
}

但是,我的代码不适用于std中的向量或集合(它适用于示例中的数组)。错误沿“无法将参数2从'Iterator'转换为'const void *'”的思路。这就是我用测试值所需的谓词构建函数的方式:

template <typename Iterator, typename Predicate>
Iterator find_max(
    Iterator cur, Iterator last, Predicate pred) {
    Iterator max = cur;
    while (cur != last) {
        if (pred(max, cur) < 0) max = cur;
        cur++;
    }
    return max;
}

int pred_int(const void* p1, const void* p2) {
    int first = *((int*)p1);
    int second = *((int*)p2);
    return first - second;
}

int pred_char(const void* p1, const void* p2) {
    char* first = (char*)p1;
    char* second = (char*)p2;
    return first[0] - second[0];
}

int pred_str(const void* p1, const void* p2) {
    const char** first = ((const char**)p1);
    const char** second = ((const char**)p2);
    return strcmp(first[0], second[0]);
}

这就是我将函数用于int向量和集合的方式:

int nInt = sizeof(arr_int) / sizeof(*arr_int);
std::vector<int> vec_int(arr_int, arr_int + nInt);
std::vector<int>::iterator maxintVec = find_max(vec_int.begin(),
        vec_int.end(), pred_int);

std::set<int> set_int(arr_int, arr_int + nInt);
    std::set<int>::iterator maxintSet = find_max(set_int.begin(),
        set_int.end(), pred_int);

我对如何更改此代码的任何建议都持开放态度,以使其适用于所有给定的数据结构。谢谢!

c++ iterator predicate
1个回答
1
投票

C ++已经有一个标准的std::max_element()算法,可以完全执行您要手动执行的操作,例如:

std::max_element()

话虽这么说,问题确实在于您如何使用谓词。当然,在您的#include <algorithm> int arr_int[] = { 1, 3, 5, 7, 4, 6, 9, 2, 0 }; int main(){ int* maxint = std::max_element(&arr_int[0], &arr_int[sizeof(arr_int)/sizeof(*arr_int)], pred_int); // auto maxint = std::max_element(std::begin(arr_int), std::end(arr_int), pred_int); std::cout << *maxint <<"\n"; } 数组示例中,您将原始指针用于迭代器,因此可以将pinter转换为int[],然后再转换为void*。但是,标准容器迭代器未使用原始指针实现,因此您的强制转换将不适用于它们。相反,您的谓词参数需要是要比较的实际值类型,而不是迭代器本身。使谓词采用容器的int*value_typeintchar等),然后在调用谓词时让char*取消引用迭代器,例如:

find_max()
© www.soinside.com 2019 - 2024. All rights reserved.