在C++中,当您将类的对象放入 std::set
或 std::map
容器中时,容器需要知道如何比较这些对象以维护其内部结构。std::set
和 std::map
默认使用 std::less
来排序其内容,这要求您的类重载 <
运算符。如果您想使用自定义比较函数,您也可以提供一个比较类或函数指针作为容器的一部分模板参数。
另一方面,当使用 std::unordered_set
或 std::unordered_map
时,容器是基于哈希表实现的。这些容器不是排序的,而是使用哈希函数和相等性比较来组织元素。在这种情况下,您需要:
- 提供一个哈希函数 - 这可以通过特化
std::hash<T>
结构体或提供一个自定义函数来完成。 - 重载
==
运算符 - 这是因为unordered
容器需要知道两个键是否相等。
这是一个简单的示例,展示如何为 std::set
和 std::unordered_set
重载这些运算符:
#include <set>
#include <unordered_set>
#include <functional>
class MyClass {
public:
int value;
MyClass(int val) : value(val) {}
// 重载<运算符,用于std::set
bool operator<(const MyClass& other) const {
return value < other.value;
}
// 重载==运算符,用于std::unordered_set
bool operator==(const MyClass& other) const {
return value == other.value;
}
};
// 提供 std::hash 特化,用于std::unordered_set
namespace std {
template <>
struct hash<MyClass> {
std::size_t operator()(const MyClass& obj) const {
return std::hash<int>()(obj.value);
}
};
}
int main() {
std::set<MyClass> mySet; // 使用<进行比较
std::unordered_set<MyClass> myUnorderedSet; // 使用hash和==进行比较
// ...
}
在这个例子中,为 std::set
重载了 <
运算符,为 std::unordered_set
重载了 ==
运算符,并提供了一个特化的 std::hash<MyClass>
用于哈希。这样,MyClass
对象就可以在这两种类型的容器中使用了。