📅  最后修改于: 2023-12-03 15:14:02.310000             🧑  作者: Mango
在C++中,我们可以使用比较器(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类进行排序的例子:
#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类,满足特定的排序要求。下面是一个自定义的比较器类的例子:
#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数据进行排序并输出结果。