unordered_map自定义键类型

自定义类型:

struct my_key {
    int    num;
    string name;
};

1、由于unordered_map是采用哈希实现的,对于系统的类型int, string等,都已经定义好了hash函数,所以如果我们引入新的自定义类型的话,系统并不知道如何去计算我们引入的自定义类型的hash值,所以我们就需要自己定义hash函数,告诉系统用这种方式去计算我们引入的自定义类型的hash值
自定义的hash函数如下:

struct myHashFuc
{
	std::size_t operator()(const my_key &key) const
	{
		return std::hash<int>()(key.num);
	}
};

由于我们的结构中有int和string,所以此处直接采用系统的int的哈希做法即可

2、重载==号
除了自定义哈希函数外
系统计算了hash值后,还需要判断是否冲突,对于默认的类型,系统都知道怎样去判断是否相等,但不知道怎样去判断我们引入的自定义类型是否相等,所以需要我们重载==号,告诉系统用这种方式去判断2个键是否相等
 

struct my_key {
    int    num;
    string name;
    my_key(){}
    ~my_key(){}
    my_key(int a, string b) : num(a), name(b){}

    //重载==号
    bool operator==(const my_key &t)const {
        return this->num == t.num;
    }
};

做完上面2步,我们就可以使用自定义类型的键的unordered_map啦
完整代码如下:

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
struct my_key {
    int    num;
    string name;
    my_key(){}
    ~my_key(){}
    my_key(int a, string b) : num(a), name(b){}
    bool operator==(const my_key &t)const {
        return this->num == t.num;
    }
};
struct myHashFuc
{
	std::size_t operator()(const my_key &key) const
	{
		return std::hash<int>()(key.num);
	}
};

int main()
{
    unordered_map <my_key, bool, myHashFuc> mmp;
    my_key myuin(1, "bob");
    mmp[myuin] = true;

    cout << mmp[myuin] << endl;
    return 0;
}

 

unordered_map 是 C++ 标准库中的容器,用于实现值对的映射。默认情况下,unordered_map 可以使用基本数据类型作为和值,如 int、double、string 等。但是,如果你想要使用自定义的数据类型作为或值,需要满足以下两个条件: 1. 自定义数据类型需要定义哈希函数(hash function):unordered_map 使用哈希函数将映射到特定的存储桶中。你需要为自定义数据类型实现一个哈希函数,以便 unordered_map 可以正确地定位和操作值对。 2. 自定义数据类型需要定义相等运算符(equality operator):unordered_map 使用相等运算符来比较两个是否相等。你需要为自定义数据类型实现相等运算符,以便 unordered_map 可以正确地判断的相等性。 下面是一个示例,演示了如何在 unordered_map 中使用自定义数据类型: ```cpp #include <iostream> #include <unordered_map> class MyCustomType { public: int x; int y; bool operator==(const MyCustomType& other) const { return (x == other.x) && (y == other.y); } }; // 哈希函数的实现 // 这里简单地将 x 和 y 的值相加作为哈希值 struct MyCustomTypeHash { std::size_t operator()(const MyCustomType& obj) const { return std::hash<int>()(obj.x + obj.y); } }; int main() { std::unordered_map<MyCustomType, int, MyCustomTypeHash> myMap; MyCustomType key1; key1.x = 1; key1.y = 2; MyCustomType key2; key2.x = 3; key2.y = 4; myMap[key1] = 10; myMap[key2] = 20; std::cout << myMap[key1] << std::endl; // 输出 10 std::cout << myMap[key2] << std::endl; // 输出 20 return 0; } ``` 在上述示例中,我们定义了一个名为 MyCustomType 的自定义数据类型,并为其实现了相等运算符和哈希函数。然后,我们使用 MyCustomType 作为 unordered_map类型,并将 MyCustomTypeHash 作为自定义的哈希函数。这样,我们就可以在 unordered_map 中使用自定义的数据类型了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值