📜  如何在C++中创建用户定义类的unordered_map?

📅  最后修改于: 2021-05-30 13:07:17             🧑  作者: Mango

unordered_map用于实现哈希表。它存储键值对。对于每个键,都会计算一个哈希函数,并将值存储在该哈希条目中。预定义了标准数据类型(int,char, 字符串,..)的哈希函数。如何使用我们自己的数据类型实现哈希表?

unordered_map允许使用第三个参数来指定我们自己的哈希函数。

// Create an unordered_map with given KeyType, 
// ValueType and hash function defined by 
// MyHashType
unordered_map um;

MyHashFunction是必须包含运算符函数 ()的类或结构。

我们还必须在自己的用于处理冲突的类中实现运算符 ==

下面是一个示例代码,其中Person类的对象用作键。我们定义自己的哈希函数,该函数使用名字和姓氏的总和作为哈希表中的键。请注意,此代码的目的是仅演示使用简单的代码,而长度总和作为哈希函数可能不是一个好主意。

// CPP program to demonstrate working of unordered_map
// for user defined data types.
#include 
using namespace std;
  
// Objects of this class are used as key in hash 
// table. This class must implement operator ==()
// to handle collisions.
struct Person {
    string first, last;  // First and last names
  
    Person(string f, string l)
    {
        first = f;
        last = l;
    }
  
    // Match both first and last names in case
    // of collisions.
    bool operator==(const Person& p) const
    {
        return first == p.first && last == p.last;
    }
};
  
class MyHashFunction {
public:
  
    // Use sum of lengths of first and last names
    // as hash function.
    size_t operator()(const Person& p) const
    {
        return p.first.length() + p.last.length();
    }
};
  
// Driver code
int main()
{
    unordered_map um;
    Person p1("kartik", "kapoor");
    Person p2("Ram", "Singh");
    Person p3("Laxman", "Prasad");
  
    um[p1] = 100;
    um[p2] = 200;
    um[p3] = 100;
  
    for (auto e : um) {
        cout << "[" << e.first.first << ", " 
             << e.first.last
             << "] = > " << e.second << '\n';
    }
  
    return 0;
}
输出:
[Laxman, Prasad] = > 100
[kartik, kapoor] = > 100
[Ram, Singh] = > 200

另一个示例,其中预定义运算符使用预定义的哈希类来构成我们的整体哈希。

// CPP program to demonstrate working of unordered_map
// for user defined data types.
#include 
using namespace std; 
  
struct Person {
    string first, last;
  
    Person(string f, string l)
    {
        first = f;
        last = l;
    }
  
    bool operator==(const Person& p) const
    {
        return first == p.first && last == p.last;
    }
};
  
class MyHashFunction {
public:
  
    // We use predfined hash functions of strings
    // and define our hash function as XOR of the
    // hash values.
    size_t operator()(const Person& p) const
    {
        return (hash()(p.first)) ^ 
               (hash()(p.last));
    }
};
  
// Driver code
int main()
{
    unordered_map um;
    Person p1("kartik", "kapoor");
    Person p2("Ram", "Singh");
    Person p3("Laxman", "Prasad");
  
    um[p1] = 100;
    um[p2] = 200;
    um[p3] = 100;
  
    for (auto e : um) {
        cout << "[" << e.first.first << ", " 
             << e.first.last
             << "] = > " << e.second << '\n';
    }
  
    return 0;
}
输出:
[Laxman, Prasad] = > 100
[kartik, kapoor] = > 100
[Ram, Singh] = > 200
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”