📅  最后修改于: 2023-12-03 15:29:42.894000             🧑  作者: Mango
在C++中,我们可以使用Comparator类来定义自己的排序规则。Comparator类通常用于STL容器的排序函数中,例如sort()或者priority_queue()。Comparator类可以根据自己定义的规则对容器中的元素进行排序,而不是默认的从小到大或从大到小,这非常的灵活和方便。下面我们将介绍Comparator类的使用方法以及示例代码。
Comparator类是一个函数对象(functor),它重载了()运算符,并可以被调用执行。Comparator类通常通过定义结构体或者类来实现,它通常有一个成员函数operator(),该函数的参数类型和数量应该和sort函数或者priority_queue中的compare函数参数类型和数量一致。我们可以在operator()函数中定义自己的排序规则,例如从大到小排序。
下面是一个示例的Comparator类的定义,在该示例中,函数对象的operator()接受两个参数,比较其大小,返回值为bool类型。
struct Comparator {
bool operator()(const int& a, const int& b) const {
return a > b;
}
};
上面的例子表示定义了一个从大到小排序的规则,可以在sort函数中使用该类来实现从大到小排序。
std::vector<int> nums = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 6};
std::sort(nums.begin(), nums.end(), Comparator());
此处使用了std::sort()函数,第三个参数传入了Comparator类的实例。
下面是一个实际使用Comparator类的示例代码,该示例通过std::priority_queue实现了一个按字符串长度从小到大排序的堆。
#include <stdio.h>
#include <queue>
#include <string>
struct StringLengthComparator {
bool operator()(const std::string& str1, const std::string& str2) const {
return str1.size() > str2.size();
}
};
int main()
{
std::priority_queue<std::string, std::vector<std::string>, StringLengthComparator> q;
q.push("apple");
q.push("banana");
q.push("orange");
q.push("peach");
q.push("pineapple");
while (!q.empty()) {
std::string str = q.top();
printf("%s\n", str.c_str());
q.pop();
}
return 0;
}
该示例在priority_queue的构造函数中传入了StringLengthComparator,该类定义了按照字符串长度从小到大排序的规则。通过将一个字符串类型的vector作为priority_queue的元素类型,就实现了按照字符串长度从小到大排序的堆结构。
输出结果如下:
apple
peach
banana
orange
pineapple
通过使用Comparator类,我们可以方便地实现自己的排序规则,使得容器排序更加具有灵活性和实用性。当容器的元素类型无法直接进行排序时,Comparator类可以方便快捷地实现排序操作。这在实际编程中非常有用。