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

📅  最后修改于: 2023-12-03 15:38:31.336000             🧑  作者: Mango

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

什么是unordered_set

在C++中,unordered_set是一种哈希表的实现,用于存储无序的唯一元素集合。它提供了常数时间的搜索,插入和删除元素的操作。

如何创建用户定义的类或结构的unordered_set

假设我们有以下定义的结构体:

struct Person {
    std::string name;
    int age;
};

要在unordered_set中存储这个Person结构体,我们需要定义一个哈希函数和一个相等函数。这两个函数将被unordered_set用来计算元素的哈希码和比较元素是否相等。

定义哈希函数

哈希函数应该将Person结构体的内容转换为一个整数,作为元素的哈希码。下面是一个示例哈希函数,将Person结构体的name和age成员进行哈希:

struct PersonHash {
    std::size_t operator()(const Person& p) const {
        std::size_t name_hash = std::hash<std::string>{}(p.name);
        std::size_t age_hash = std::hash<int>{}(p.age);
        return name_hash ^ age_hash;
    }
};

这个哈希函数计算name和age的哈希码,并将它们异或在一起作为元素的最终哈希码。在这个例子中,我们使用了std::hash模板类来计算字符串和整数的哈希码。

定义相等函数

相等函数应该检查两个Person结构体是否相等。下面是一个示例相等函数,检查两个Person结构体的name和age成员是否相等:

struct PersonEqual {
    bool operator()(const Person& p1, const Person& p2) const {
        return p1.name == p2.name && p1.age == p2.age;
    }
};

这个相等函数检查两个Person结构体的name和age成员是否相等,如果相等则返回true,否则返回false。

创建unordered_set

有了哈希函数和相等函数之后,我们就可以创建一个unordered_set来存储Person结构体了。下面是一个示例代码:

std::unordered_set<Person, PersonHash, PersonEqual> people;

Person p1 = {"Alice", 30};
Person p2 = {"Bob", 25};

people.insert(p1);
people.insert(p2);

std::cout << "Number of people: " << people.size() << std::endl;

这个示例代码创建了一个unordered_set来存储Person结构体。在创建unordered_set时,我们需要提供三个模板参数:元素类型,哈希函数类型和相等函数类型。

在上面的示例中,我们向unordered_set中插入了两个Person结构体,并输出了集合中元素的数量。

总结

通过定义哈希函数和相等函数,我们可以在C++中创建用户定义的类或结构的unordered_set。这个过程可以帮助我们存储无序的唯一元素集合,并提供常数时间的搜索,插入和删除元素的操作。