📅  最后修改于: 2023-12-03 14:55:56.959000             🧑  作者: Mango
在C++中,我们通常使用比较器函数来对一些对象进行排序。比较器函数可以自定义实现,但是在某些情况下,我们需要传递一些额外的参数给比较器函数,以便在排序时使用。本文将给程序员介绍在C++中如何在比较器函数中使用额外的参数进行排序。
我们可以在定义比较器函数时,使用函数指针传递额外参数。比如,我们定义一个名为cmp
的比较器函数:
bool cmp(int a, int b, int c) {
return a + b < c;
}
这里我们定义了一个带有三个参数的比较器函数,它将三个参数中的前两个数字相加,并与第三个数字进行比较,以判断大小。其中,参数a和b代表要进行比较的两个数字,参数c代表额外参数。
在使用该比较器函数进行排序时,我们需要使用一个函数指针将该比较器函数的地址传递给sort()函数,并同时传递额外参数:
int main() {
vector<int> vec = {2, 4, 1, 5, 3};
int c = 6; // 额外参数
sort(vec.begin(), vec.end(), [](int a, int b) {return cmp(a, b, c);});
for (int i = 0; i < vec.size(); i++) {
cout << vec[i] << " ";
}
return 0;
}
这里我们将额外参数c
定义为6
,并在lambda表达式中使用[]
语法捕获该参数。然后在lambda表达式中调用比较器函数cmp()
,并传递三个参数,其中前两个参数表示要进行比较的两个数字,第三个参数则是引用捕获的额外参数c
。
最后,我们使用sort()
函数将向量进行排序,并输出结果:
1 2 3 4 5
除了使用函数指针传递额外参数外,我们还可以使用结构体来传递参数。定义一个结构体,将需要的参数打包到结构体中,然后将结构体的地址传递给比较器函数。比如:
struct Cmp {
Cmp(int c) : c(c) {}
bool operator()(int a, int b) const {
return a + b < c;
}
int c;
};
在这个结构体中,我们使用一个私有成员变量c
来保存额外参数。然后我们定义了一个圆括号运算符,用于调用比较器函数,此时我们可以在圆括号运算符中访问结构体的所有成员变量。在圆括号运算符中的语句,与先前的比较器函数是等效的。
我们可以使用它来进行排序:
int main() {
vector<int> vec = {2, 4, 1, 5, 3};
int c = 6; // 额外参数
sort(vec.begin(), vec.end(), Cmp(c));
for (int i = 0; i < vec.size(); i++) {
cout << vec[i] << " ";
}
return 0;
}
在这里,我们创建了一个结构体Cmp,并传递额外参数c
给它。然后我们使用该结构体Cmp来传递比较器函数给sort()函数,并排序。
最后,我们使用for
循环来输出结果:
1 2 3 4 5
至此,我们已经学习了如何在比较器函数中使用额外参数进行排序。希望对你有帮助!