为了使用自定义类型作为关键字在哈希容器中,你需要定义一个哈希函数和相等性比较。以下是一个简单的例子。 假设你有一个点结构体Point,表示二维坐标: #include <iostream> #include <unordered_map> #include <functional> struct Point { int x, y; Point(int _x, int _y) : x(_x), y(_y) {} bool...
是一个用于自定义类型MyClass的哈希函数的声明。哈希函数是一种将任意大小的数据映射到固定大小值的函数。在C++中,std::hash是一个模板类,用于生成哈希值。 对于自定义类型MyClass,我们可以通过重载运算符()来定义自己的哈希函数。然后,使用std::hash模板类的特化版本std::hash<MyClass>来调用我们定义的哈希函数。
对于自定义类型,C++标准库无法直接提供哈希函数,因此需要用户自己定义。 2. 编写一个满足std::unordered_set要求的自定义hash函数 为了编写自定义哈希函数,通常需要包含 <functional> 头文件,并使用 std::hash 结构体模板作为基类(如果可能)。然而,对于自定义类型,通常需要从头开始编写哈希函数。以下是一个...
last_name) << ") = " << MyHash{}(obj) << "(使用 MyHash)\n" << std::setw(31) << "或 " << std::hash<S>{}(obj) << "(使用注入的特化)\n"; // 自定义散列函数令在无序容器中使用自定义类型可行。 // 此示例将使用注入的 std::hash 特化, // 如果要使用 MyHash 替代,那么...
但是自定义的类型需要程序员自己定义std::hash<T>的特例化实现 比如下面代码就为自定义类型struct S提供 了std::hash<S>特例化实现 代码语言:javascript 复制 structS{std::string first_name;std::string last_name;};/* 为S提供 std::hash<T>特例化实现 */namespace std{template<>struct hash<S>{typede...
下列代码演示如何为自定义类特化 std::hash 模板。此散列函数使用 Fowler–Noll–Vo 散列算法。 运行此代码 #include <cstdint> #include <functional> #include <iostream> #include <string> struct Employee { std::string name; std::uint64_t ID; }; namespace std { template <> class hash<Employee>...
下列代码演示如何为自定义类特化 std::hash 模板。 运行此代码 #include <functional> #include <iostream> #include <string> struct Employee { std::string name; unsigned int ID; }; namespace std { template <> class hash<Employee> { public: size_t operator()(const Employee &employee) const {...
也就是说,如果你的key使用的是以上类型中的一种,你都可以使用缺省的hash函数。当然你自己也可以定义自己的hash函数。对于自定义变量,你只能如此,例如对于string,就必须自定义hash函数。 第六点到此为止,太难了,以我现在的水平也写不出案例,要对底层进行调用。
对于unordered_map而言,当我们插入<key, value>的时候,需要哈希函数的函数对象对key进行hash,又要利用等比函数的函数对象确保插入的键值对没有重复。然而,当我们自定义类型时,c++标准库并没有对应的哈希函数和等比函数的函数对象。因此需要分别对它们进行定义。
https://github.com/gcc-mirror/gcc/blob/7eaf95689bf495ab07473951ededa835eb618123/libstdc%2B%2B-...