📅  最后修改于: 2023-12-03 15:38:31.336000             🧑  作者: Mango
在C++中,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来存储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。这个过程可以帮助我们存储无序的唯一元素集合,并提供常数时间的搜索,插入和删除元素的操作。