分享文章:C++ STL无序容器自定义哈希函数和比较规则(超级详细) | 云图网
当无序容器中存储的是基本类型(int、double、float、string)数据时,自定义哈希函数和比较规则,都只能以函数对象类的方式实现。
而当无序容器中存储的是用结构体或类自定义类型的数据时,自定义哈希函数的方式只有一种,即使用函数对象类的形式;而自定义比较规则的方式有两种,要么也以函数对象的方式,要么仍使用默认的std::equal_to<key>规则,但前提是必须重载==运算符。
#include <iostream>
#include <string>
#include <unordered_set>
using namespace std;
class Person {
public:
Person(string name, int age) :name(name), age(age) {};
string getName() const;
int getAge() const;
private:
string name;
int age;
};
string Person::getName() const {
return this->name;
}
int Person::getAge() const {
return this->age;
}
//自定义哈希函数
class hash_fun {
public:
int operator()(const Person &A) const {
return A.getAge();
}
};
//重载 == 运算符,myset 可以继续使用默认的 equal_to<key> 规则
bool operator==(const Person &A, const Person &B) {
return (A.getAge() == B.getAge());
}
//完全自定义比较规则,弃用 equal_to<key>
class mycmp {
public:
bool operator()(const Person &A, const Person &B) const {
return (A.getName() == B.getName()) && (A.getAge() == B.getAge());
}
};
int main()
{
//使用自定义的 hash_fun 哈希函数,比较规则仍选择默认的 equal_to<key>,前提是必须重载 == 运算符
std::unordered_set<Person, hash_fun> myset1{ {"zhangsan", 40},{"zhangsan", 40},{"lisi", 40},{"lisi", 30} };
//使用自定义的 hash_fun 哈希函数,以及自定义的 mycmp 比较规则
std::unordered_set<Person, hash_fun, mycmp> myset2{ {"zhangsan", 40},{"zhangsan", 40},{"lisi", 40},{"lisi", 30} };
cout << "myset1:" << endl;
for (auto iter = myset1.begin(); iter != myset1.end(); ++iter) {
cout << iter->getName() << " " << iter->getAge() << endl;
}
cout << "myset2:" << endl;
for (auto iter = myset2.begin(); iter != myset2.end(); ++iter) {
cout << iter->getName() << " " << iter->getAge() << endl;
}
return 0;
}
运行结果:

本文介绍了在C++中,如何为STL无序容器如unordered_set自定义哈希函数和比较规则。对于基本类型,两者均需通过函数对象实现。而对于自定义类型如Person类,哈希函数同样要求函数对象,而比较规则可以使用函数对象或重载==运算符来实现默认的equal_to<key>规则。示例代码展示了这两种情况的应用。

341

被折叠的 条评论
为什么被折叠?



