📅  最后修改于: 2023-12-03 14:58:42.432000             🧑  作者: Mango
在 C++ 中, STL 提供了许多容器来存储数据,如 vector,set,map 等。这些容器中存储的元素可以是基本数据类型,但也可以是自定义的结构体或类对象,这些自定义的元素类型有时需要进行比较,以便于进行排序、查找等操作。在这种情况下,你需要编写自定义比较器。
比较器是一个函数对象,用于比较两个元素的大小关系。可以将比较器看做是一个独立的函数,但它其实是一个符合某种接口规范(比如重载了 operator() 运算符)的类对象。
当容器需要按照某种顺序存储元素或查询元素时,它会根据需要调用这个比较器来进行元素间的比较。比较器必须返回 bool 值,并且符合“严格弱序关系(similar to, but not necessarily the same as, a ‘less-than’ comparison)”。
下面我们来看一个示例,假设我们有一个自定义结构体 Person,它包含两个成员变量,分别是姓名和年龄:
struct Person {
std::string name;
int age;
};
现在我们想要按照 Person 的年龄进行排序,我们需要编写一个比较器:
struct AgeComparator {
bool operator() (const Person& p1, const Person& p2) const {
return p1.age < p2.age;
}
};
这个比较器是一个函数对象,它有一个名为 operator() 的函数,用于比较两个 Person 对象的年龄大小。比较器中的 const 保证了比较器不会改变 Person 对象的状态,这是一个好的编程习惯。
在容器中使用比较器很简单,只需要将比较器作为容器构造函数的第二个参数即可:
std::set<Person, AgeComparator> people;
这里创建了一个 set 容器,存储的元素类型是 Person,使用的比较器是 AgeComparator。这样,当我们向 people 中添加元素时,它会根据年龄进行排序,从小到大排列。
自定义比较器是 C++ STL 中非常重要的一个概念,它让我们可以对自定义的元素类型进行比较,从而支持排序、查找等操作。比较器必须符合“严格弱序关系”,而使用比较器则非常简单,只需要将其作为容器构造函数的第二个参数即可。