❤️️💚💙💛🧡💜🖤🤍🧡
大家好!我是曾续缘🥰
欢迎关注💕
❤️点赞 👍 收藏 ⭐再看,养成习惯
🔥不要轻易放弃你的梦!继续睡!📚
C++中的unordered_set是一种关联容器,它存储唯一的元素集合,并且可以提供O(1)时间复杂度的插入、删除和查找操作。与常规的set相比,unordered_set使用哈希函数来映射元素到桶(bucket),使得查找元素变得更加高效。
要使用自定义的结构体作为unordered_set的元素类型,我们需要手动实现两个方法:哈希函数和等于运算符。哈希函数是一种将数据映射到唯一数字的算法。为了让unordered_set能够正确地将元素分配到不同的桶中,我们需要为结构体定义一个哈希函数。
等于运算符是一种用来比较两个元素是否相等的方法。由于unordered_set需要能够比较元素,所以我们需要重载结构体的等于运算符。
下面是一个实现了自定义的unordered_set的Person结构体的例子:
#include <iostream>
#include <string>
#include <unordered_set>
using namespace std;
struct Person {
string name;
int age;
bool operator==(const Person& rhs) const {
return (name == rhs.name && age == rhs.age);
}
};
struct PersonHash {
size_t operator()(const Person& p) const {
return hash<string>()(p.name) ^ hash<int>()(p.age);
}
};
int main() {
unordered_set<Person, PersonHash> hashSet;
hashSet.emplace(Person{"Alice", 20});
hashSet.emplace(Person{"Bob", 30});
hashSet.emplace(Person{"Charlie", 40});
hashSet.emplace(Person{"Alice", 20});
for (auto& p : hashSet) {
cout << "Name: " << p.name << ", Age: " << p.age << endl;
}
return 0;
}
在上面的例子中,我们首先定义了一个名为Person的结构体,并在其中添加了name和age字段。接下来,我们重载了等于运算符==,以便unordered_set知道如何比较Person对象是否相等。然后我们定义了一个名为PersonHash的结构体,它覆盖了哈希函数operator()。在哈希函数中,我们使用STL提供的hash<>模板对Person对象的name和age进行哈希,最后将结果进行异或操作。
在主函数中,我们创建了一个名为hashSet的unordered_set<Person, PersonHash>对象,并添加了几个Person对象。由于我们已经定义了哈希函数和等于运算符,unordered_set将能够正确地处理元素的比较和哈希。最后,我们遍历unordered_set,并打印出每个Person对象的name和age。
通过自定义unordered_set,可以让我们高效地存储和检索我们的数据。由于哈希函数和等于运算符的实现可能影响unordered_set的性能,所以我们应该尽可能地设计高效的哈希函数和等于运算符。
size_t
是一个无符号整型类型,通常用于存储内存块大小、数组长度和索引等。在C++标准库中,size_t
类型定义在头文件<cstddef>
中,并通常被用于诸如sizeof
操作符的返回类型中。
在实现哈希函数时,通常使用size_t
类型来存储哈希值,因为它的范围足够大,可以提供足够的空间来存储所有可能的哈希值,同时可以确保哈希函数返回的哈希值满足一些性质,例如哈希冲突尽量少等。
在使用STL提供的哈希函数模板时,通常会将哈希函数的返回类型指定为size_t
类型,例如:
struct MyHash {
size_t operator()(const MyStruct& s) const {
// 哈希函数实现
// ...
return hash_value;
}
};
unordered_set<MyStruct, MyHash> mySet;
在上面的例子中,我们定义了一个名为MyHash
的结构体,它覆盖了哈希函数operator()
。在哈希函数中,我们实现了自定义的哈希算法,并将哈希值存储在一个名为hash_value
的变量中。由于哈希函数的返回类型为size_t
,所以我们需要确保hash_value
的类型也为size_t
。
最后,我们将自定义的哈希函数作为第二个模板参数传递给unordered_set
对象,以便让unordered_set
知道如何对元素进行哈希。