我正在尝试实现一个函数,该函数可以为我的学校作业查找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 ++已经有一个标准的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_type
,int
,char
等),然后在调用谓词时让char*
取消引用迭代器,例如:
find_max()