大佬教程收集整理的这篇文章主要介绍了C++ STL无序容器自定义哈希函数和比较规则(超级详细),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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; }在此基础上,假设我们想创建一个可存储 Person 类对象的 unordered_set 容器,考虑到 Person 为自定义的类型,因此默认的 hash<key> 哈希函数不再适用,这时就需要以函数对象类的方式自定义一个哈希函数。比如:
class hash_fun { public: int operator()(const Person &A) const { return A.getAge(); } };可以看到,我们利用 hash_fun 函数对象类的 ( ) 运算符重载方法,自定义了适用于 Person 类对象的哈希函数。该哈希函数每接收一个 Person 类对象,都会返回该对象的 age 成员变量的值。
std::unordered_set<Person,hash_fun> myset;但是,此时创建的 myset 容器还无法使用,因为该容器使用的是默认的 std::equal_to<key> 比较规则,但此规则并不适用于该容器。
template<class T> class equal_to { public: bool operator()(const T& _Left,const T& _Right) const{ return (_Left == _Right); } };可以看到,该规则在底层实现过程中,直接用 == 运算符比较容器中任意 2 个元素是否相等,这意味着,如果容器中存储的元素类型,支持直接用 == 运算符比较是否相等,则该容器可以使用默认的 std::equal_to<key> 比较规则;反之,就不可以使用。
bool operator==(const Person &A,const Person &B) { return (A.getAge() == B.getAge()); }可以看到,通过此方式重载的运算符,当 std::equal_to<key> 函数对象类中直接比较 2 个 Person 类对象时,实际上是在比较这 2 个对象的 age 成员变量是否相等。换句话说,此时的 std::equal_to<key> 规则的含义为:只要 2 个 Person对象的 age 成员变量相等,就认为这 2 个 Person 对象是相等的。
std::unordered_set<Person,hash_fun> myset{ {"zhangsan",40},{"zhangsan",{"lisi",30} };注意,虽然这里给 myset 容器初始化了 4 个 Person 对象,但由于比较规则以各个类对象的 age 值为准,myset 容器会认为前 3 个 Person 对象是相等的,因此最终 myset 容器只会存储 {"zhangsan",40} 和 {"lisi",30}。
class mycmp { public: bool operator()(const Person &A,const Person &B) const { return (A.getName() == B.getName()) && (A.getAge() == B.getAge()); } };在 mycmp 规则的基础上,我们可以像如下这样创建 myset 容器:
std::unordered_set<Person,hash_fun,mycmp> myset{ {"zhangsan",30} };由此创建的 myset 容器,虽然初始化了 4 个 Person 对象,但 myset 容器根据 mycmp 比较规则,可以识别出前 2 个是相等的,因此最终该容器内部存有 {"zhangsan",40}、{"lisi",30} 这 3 个 Person 对象。
#include <iostream> #include <String> #include <unordered_set> using namespace std; class Person { public: Person(String 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",30} }; //使用自定义的 hash_fun 哈希函数,以及自定义的 mycmp 比较规则 std::unordered_set<Person,mycmp> myset2{ {"zhangsan",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; }程序执行结果为:
myset1:
zhangsan 40
lisi 30
myset2:
lisi 40
zhangsan 40
lisi 30
以上是大佬教程为你收集整理的C++ STL无序容器自定义哈希函数和比较规则(超级详细)全部内容,希望文章能够帮你解决C++ STL无序容器自定义哈希函数和比较规则(超级详细)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。