C++使用自定义的结构体作为unordered_set的元素类型实现方法

❤️️💚💙💛🧡💜🖤🤍🧡

大家好!我是曾续缘🥰

欢迎关注💕

❤️点赞 👍 收藏 ⭐再看,养成习惯

🔥不要轻易放弃你的梦!继续睡!📚

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知道如何对元素进行哈希。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
结构体可以作为unordered_set元素,unordered_setC++标准库中的一个容器,用于存储唯一的元素,且元素的顺序是无序的。结构体作为unordered_set元素时,需要满足以下条件: 1. 定义哈希函数:unordered_set使用哈希函数来确定元素的存储位置,因此需要为结构体定义一个哈希函数。哈希函数应该将结构体映射到一个唯一的整数值。 2. 定义相等比较函数:unordered_set使用相等比较函数来判断两个元素是否相等。相等比较函数应该比较结构体的各个成员变量是否相等。 下面是一个示例代码,演示了如何将结构体作为unordered_set元素: ```cpp #include <iostream> #include <unordered_set> // 定义结构体 struct Person { std::string name; int age; }; // 定义哈希函数 struct PersonHash { std::size_t operator()(const Person& p) const { // 将name和age拼接后计算哈希值 return std::hash<std::string>()(p.name) ^ std::hash<int>()(p.age); } }; // 定义相等比较函数 struct PersonEqual { bool operator()(const Person& p1, const Person& p2) const { return p1.name == p2.name && p1.age == p2.age; } }; int main() { // 创建unordered_set,并指定哈希函数和相等比较函数 std::unordered_set<Person, PersonHash, PersonEqual> personSet; // 添加元素 Person p1{"Alice", 20}; Person p2{"Bob", 25}; Person p3{"Alice", 20}; personSet.insert(p1); personSet.insert(p2); personSet.insert(p3); // 遍历输出元素 for (const auto& person : personSet) { std::cout << "Name: " << person.name << ", Age: " << person.age << std::endl; } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值