是的,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 类型了。