【发布时间】:2015-05-07 12:46:31
【问题描述】:
我正在尝试通过为const char 提供特化来扩展std::hash<T>,以便我可以使用const char* 作为std::unordered_map 中的键类型。
这是我尝试过的:
#include <unordered_map>
#include <functional>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
namespace std
{
template<>
struct hash<const char*>
{
size_t operator()(const char* const& s) const
{
size_t h = 0;
const char* tmp = s;
while (*tmp)
h = (h << 5) + h + (unsigned char)toupper(*tmp++);
printf("hash of '%s' is (%ld)\n", s, h);
return h;
}
};
}
int main(int argc, char* argv[])
{
const char* name1= "Mark Nelson";
const char* name2= strdup(name1);
std::unordered_map<const char*, int> map;
printf("Insert (%s)\n", name1);
map[name1]= 100;
printf("Lookup (%s)\n", name1);
printf("map[%s](name1) = %d\n", name1, map.find(name1) != map.end() ? map.find(name1)->second : -1);
printf("Lookup (%s)\n", name2);
printf("map[%s](name2) = %d\n", name2, map.find(name2) != map.end() ? map.find(name2)->second : -1);
return 0;
}
输出是什么:
Insert (Mark Nelson)
hash of 'Mark Nelson' is (121066894705597050)
Lookup (Mark Nelson)
hash of 'Mark Nelson' is (121066894705597050)
hash of 'Mark Nelson' is (121066894705597050)
map[Mark Nelson](name1) = 100
Lookup (Mark Nelson)
hash of 'Mark Nelson' is (121066894705597050)
map[Mark Nelson](name2) = -1
所以在我看来,std::unordered_map 正在使用我提供的哈希实现来进行插入和查找。但是由于某种原因,它没有通过name2找到值,这似乎是仍然使用指针比较。
这里有什么问题?我用的是GCC 4.8.2,文件是用g++ -std=c++11 main.cc编译的
【问题讨论】:
-
在
std中定义东西通常不是一个好主意。 -
@Lingxi 我在一定程度上同意,但您需要在其特定命名空间中重载模板。
标签: c++ templates c++11 std unordered-map