是的,C++ 的 set
和 map
容器可以处理自定义类型。为了使它们能够处理自定义类型,您需要提供适当的比较函数或比较对象,以便容器可以对元素进行排序和查找。
对于 set
,您可以提供一个比较函数,该函数接受两个自定义类型的对象作为参数,并返回一个布尔值,表示它们是否相等。例如:
struct Person {
std::string name;
int age;
};
bool comparePersons(const Person& p1, const Person& p2) {
return p1.name < p2.name;
}
int main() {
std::set<Person, decltype(comparePersons)> people(comparePersons);
// ...
}
在这个例子中,我们定义了一个 Person
结构体,并提供了一个比较函数 comparePersons
,用于比较两个 Person
对象。然后,我们创建了一个 set
容器,并将比较函数作为第二个模板参数传递给它。这样,set
就可以使用我们提供的比较函数来处理 Person
类型了。
对于 map
,您需要提供一个比较对象,该对象必须满足 operator<
的重载版本,以便容器可以对键进行排序。例如:
struct Person {
std::string name;
int age;
};
bool operator<(const Person& p1, const Person& p2) {
return p1.name < p2.name;
}
int main() {
std::map<Person, std::string> people;
// ...
}
在这个例子中,我们重载了 Person
类型的 operator<
,以便可以对它们进行比较。然后,我们创建了一个 map
容器,并将 Person
类型作为键类型传递给它。这样,map
就可以使用我们提供的比较操作符来处理 Person
类型了。