关于 hash()的理解
看C++Primer无序容器里面的 hash类型 有一段代码,对写法不太明白,学习记录一下。
这其实是 标准库的哈希函数 的一个重载函数调用运算符 () 的调用。
size_t hasher(Const Sales_data &sd)
{
return hash<string>() (sd.isbn()); //就是这行的写法
}
原文描述:
“hasher函数使用一个标准库hash类型对象来计算isbn的哈希值,该hash类型建立在string类型之上。”
仿函数
理解上面的语法,就先了解下仿函数,C++允许类重载函数调用运算符,这样的话,我们可以像使用函数一样使用该类。下面写一段测试代码来帮助理解上面那段看起来不太明白的写法。
#include <iostream>
using namespace std;
//定义一个对象
struct Hasher
{
public:
//默认构造函数
Hasher()
{
cout << "Hasher default ctor" << endl;
}
//接受一个参数的构造函数
Hasher(const char *str)
{
cout << "Hasher ctor:" << str << endl;
}
//重载函数调用运算符
size_t operator() (const char *str) const
{
cout << "calling func:" << str << endl;
}
}
int main(int argc, char *argv[])
{
Hasher hasher("create obj");
//下面这行对象调用了重载的函数运算符,就像调用函数一样
//(类对象具有“像函数一样的行为”)
hasher("testing 111");
//仿照文章最开头那段代码 ---->hash<string>() ((sd.isbn))
Hasher()("testing 222");
return 0;
}
上面代码的运行结果:
Hasher ctor:create obj
calling func:testing 111
Hasher default ctor
calling func:testing 222
程序运行输出结果的第三行和第四行就对应了:
Hasher()("testing 222");
调用默认构造函数先创建了一个临时的对象,然后再调用了重载的函数调用运算符,注意Hasher而不是hasher,C++允许直接通过类名+()来创建一个临时对象(即 “Hasher()”),它只在当前行有效。
参考(转载)链接: 博客.