📜  如何在C++中创建用户定义的类或结构的unordered_set?

📅  最后修改于: 2021-05-30 04:22:32             🧑  作者: Mango

unordered_set在内部实现一个哈希表来存储元素。默认情况下,我们只能将预定义类型存储为int, 字符串,float等。
如果我们要将用户定义类型的元素存储为结构,则编译器将显示错误,因为在将元素存储到unordered_set中之前,编译器会执行一些检查。并且在比较两个用户定义的类型时,编译器无法比较它们,因此会产生错误。
因此,为了将结构存储在unordered_set中,需要设计一些比较函数。由于unordered_set还存储实现哈希表来存储元素,因此我们还必须实现哈希函数以执行与哈希相关的工作。
下面的方法说明了其实现。
实现:我们创建一个结构类型并在该结构内部定义一个比较函数,该函数将用于比较两个结构类型对象。由于unordered_set在内部实现哈希函数,因此我们还应该为用户定义的类型对象实现哈希函数。
语法要存储用户定义的类型元素,unordered_set应该遵循以下语法

unordered_set(elementType, MyHashType) us;
// element type is user defined type and MyHashType is class implementing hash function

下面的代码对此进行了解释。

// CPP implementation to use
// user-defined data type in
// structures
#include 
using namespace std;
  
// Structure definition
struct Test {
  
    int id;
  
    // This function is used by unordered_set to compare
    // elements of Test.
    bool operator==(const Test& t) const
    {
        return (this->id == t.id);
    }
};
  
// class for hash function
class MyHashFunction {
public:
    // id is returned as hash function
    size_t operator()(const Test& t) const
    {
        return t.id;
    }
};
  
// Driver method
int main()
{
    // put values in each
    // structure define below.
    Test t1 = { 110 }, t2 = { 102 },
         t3 = { 101 }, t4 = { 115 };
  
    // define a unordered_set having
    // structure as its elements.
    unordered_set us;
  
    // insert structure in unordered_set
    us.insert(t1);
    us.insert(t2);
    us.insert(t3);
    us.insert(t4);
  
    // printing the elements of unordered_set
    for (auto e : us) {
        cout << e.id << " ";
    }
  
    return 0;
}
输出:
115 101 110 102
输出:
115 101 110 102

下面是另一个示例,其中我们使用预定义的哈希函数来构成所定义类的整体哈希函数。

// CPP program to demonstrate working of unordered_set
// 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_set us;
    Person p1("kartik", "kapoor");
    Person p2("Ram", "Singh");
    Person p3("Laxman", "Prasad");
  
    us.insert(p1);
    us.insert(p2);
    us.insert(p3);
  
    for (auto e : us) {
        cout << "[" << e.first << ", "
             << e.last << "]\n";
    }
  
    return 0;
}
输出:
[Laxman, Prasad]
[kartik, kapoor]
[Ram, Singh]
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”