📜  C ++中的Comparator类及其示例(1)

📅  最后修改于: 2023-12-03 15:29:42.894000             🧑  作者: Mango

C++中的Comparator类及其示例

在C++中,我们可以使用Comparator类来定义自己的排序规则。Comparator类通常用于STL容器的排序函数中,例如sort()或者priority_queue()。Comparator类可以根据自己定义的规则对容器中的元素进行排序,而不是默认的从小到大或从大到小,这非常的灵活和方便。下面我们将介绍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类可以方便快捷地实现排序操作。这在实际编程中非常有用。