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

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

C++中的Comparator类及其示例

在C++中,我们可以使用比较器(Comparator)类来实现自定义排序。比较器类是一个实现了重载()运算符的类,我们可以用它来为我们的数据类型定义排序规则。

Comparator类的定义

比较器类的定义非常简单,只需要实现一个重载()运算符即可。下面是一个简单的比较器类的定义:

template<typename T>
class MyComparator {
public:
    bool operator() (const T& a, const T& b) const {
        return a < b; // 返回a是否小于b
    }
};

这个比较器类定义了一个重载()运算符,用于比较两个类型为T的对象a和b。它返回a是否小于b的结果。这个比较器类可以用于排序任何类型T的对象。

使用Comparator类进行排序

有了比较器类后,我们就可以利用它进行排序了。下面是一个使用Comparator类进行排序的例子:

#include <iostream>
#include <vector>
#include <algorithm>

template<typename T>
class MyComparator {
public:
    bool operator() (const T& a, const T& b) const {
        return a < b; // 返回a是否小于b
    }
};

int main() {
    std::vector<int> vec{3, 1, 4, 1, 5, 9, 2, 6, 5, 3};

    // 使用Comparator进行升序排序
    std::sort(vec.begin(), vec.end(), MyComparator<int>());

    for (auto& i : vec) {
        std::cout << i << " ";
    }
    std::cout << std::endl;

    return 0;
}

这个例子中,我们首先定义了一个vector类型的数据,然后用std::sort函数对其进行排序。由于vector包含的是int类型的数据,我们需要使用MyComparator比较器类来定义排序规则。这个比较器类按升序排序,也就是说,小的数排在前面。

自定义Comparator类

我们可以根据需要自定义Comparator类,满足特定的排序要求。下面是一个自定义的比较器类的例子:

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

class Person {
public:
    std::string name;
    int age;
    float income;

    Person(const std::string& n, int a, float i) : name(n), age(a), income(i) {}

    // 重载小于运算符,按年龄升序排列,年龄相同时,按收入降序排列
    bool operator< (const Person& other) const {
        if (age != other.age) {
            return age < other.age;
        } else {
            return income > other.income;
        }
    }
};

class PersonComparator {
public:
    bool operator() (const Person& a, const Person& b) const {
        if (a.age != b.age) {
            return a.age < b.age;
        } else {
            return a.income > b.income;
        }
    }
};

int main() {
    std::vector<Person> vec{
        {"Alice", 25, 3000},
        {"Bob", 30, 5000},
        {"Charlie", 20, 2000},
        {"David", 30, 4000},
        {"Eva", 25, 3500},
        {"Frank", 20, 1500}
    };

    // 使用默认的小于运算符进行排序
    std::sort(vec.begin(), vec.end());

    std::cout << "按年龄升序排序(年龄相同时按收入降序):" << std::endl;
    for (auto& i : vec) {
        std::cout << i.name << " " << i.age << " " << i.income << std::endl;
    }

    // 使用自定义的Comparator进行排序
    std::sort(vec.begin(), vec.end(), PersonComparator());

    std::cout << "按年龄升序排序(年龄相同时按收入升序):" << std::endl;
    for (auto& i : vec) {
        std::cout << i.name << " " << i.age << " " << i.income << std::endl;
    }

    return 0;
}

这个例子中,我们定义了一个Person类,它包含三个成员变量:名称,年龄和收入。我们定义了Person类的小于运算符,按照年龄升序排列,年龄相同时按照收入降序排列。然后,我们定义了一个自定义的比较器类PersonComparator,它使用与小于运算符类似的规则进行排序。最后使用这个比较器类对Person类型的vector数据进行排序并输出结果。