📜  比较器函数中用于排序的额外参数 - C++ (1)

📅  最后修改于: 2023-12-03 14:55:56.959000             🧑  作者: Mango

比较器函数中用于排序的额外参数 - C++

在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

至此,我们已经学习了如何在比较器函数中使用额外参数进行排序。希望对你有帮助!