1

我想创建一个 unordered_map,它具有 achar*作为键和 avector<int>作为value. 我从之前的问题中了解到,char* STL 没有提供散列函数。

我从这个站点获取了第一个实现:http ://www.cse.yorku.ca/~oz/hash.html

因此,在我的main.cpp文件中,我插入了以下代码:

namespace std
{
   template<>
   struct hash<char*>: public std::unary_function<char *, size_t>
   {
      size_t operator()(char * str) const{
      size_t hash = 5381;
      int c;

      while(c = *str++)
        hash = ((hash << 5) + hash) + c; /* hash * 33 + c */

      return hash;

     }
  };
}

然后我创建了一个 unordered_map 变量:

std::unordered_map<char *, vector<int>> test;

但是,如果我通过这样做两次插入值“temp”:

std::unordered_map<char *, vector<int>> test;
char *t1 = new char[5];
strcpy(t1, "temp");
char *t2 = new char[5];
strcpy(t2, "temp");
vector<int>& ptr = test[t1];
ptr.push_back(0);
vector<int>& ptr2 = test[t2];
ptr2.push_back(1);

最终映射不是有一个“temp”键和一个大小为 2 的向量,其中向量的每个元素是 0 或 1,它有两个名为“temp”的键,每个键中有一个大小为 1 的向量。

这是详细的图片: 在此处输入图像描述

我怎样才能避免这种情况发生?先感谢您

4

1 回答 1

3

这不是散列函数的问题,而是char*' 的相等性的问题。您依赖于指针比较,并且您可以从调试器监视变量中看到,各种“临时”文字的指针具有不同的位置,因此不相等。

您需要定义一个实际执行字符串比较的等式仿函数,并将其与unordered_map.

或者,不要使用char*作为您的密钥,而是使用std::string并完全避免此问题。

于 2013-03-27T18:02:15.107 回答