使用指针地址作为键的unordered_map

4

我正在尝试创建一个地图,其中自定义键是对象的指针地址,正如所提到的。

我需要这个地址,因为现在这是比较两个对象之间唯一相关的方式。

从我的理解来看,正确的做法是使用const char*作为键。

这是typedef

typedef __gnu_cxx::unordered_map<const char*, std::string> TargetsTags;

我对以下内容有些困惑:
如何创建operator()
这是我用于std::string的方式:
namespace __gnu_cxx {
    template<>
    struct hash<std::string>
    {
        hash<const char*> h;
        size_t operator()(const std::string &s) const
        {
            return h(s.c_str());
        };
    };
}

那么const char*是怎样的呢?

这样做是否正确?


你注意到 __gnu_cxx 中的那两个前导下划线了吗?这基本上意味着它是一个私有符号。如果你的编译器和标准库太旧而不支持 C++11,那么请使用 std::tr1 命名空间及其头文件;如果你的编译器和库甚至不支持 TR1,则请使用 Boost。 - Some programmer dude
关于使用指针作为键,请不要这样做。即使您有两个指向内存的字符串,在每个方面都相同,除了它们是两个不同的分配,那么这也行不通。哈希是在指针上完成,而不是它们所指向的内容。 - Some programmer dude
@JoachimPileborg 感谢您的评论,但我现在必须使用指针作为键。至于 __gnu_cxx,您是正确的。 - Itzik984
你总是可以为unordered_map提供自己的哈希和相等函数,将const char *转换为字符串,例如:__gnu_cxx::unordered_map<const char*, std::string, myhashtype, myequalstype>(如果它在C++11中工作,不确定在你的编译器中如何实现,但是当你尝试使用hash<std::string>时,我感觉这是一个好的方向)... - W.F.
1个回答

5

使用c++11的工作示例:

#include <iostream>
#include <unordered_map>
#include <string>
#include <functional>

using namespace std;

class myhash {
public:
   size_t operator() (const char *val) const {
      return std::hash<std::string>()(val);
   }
};

class myequal {
public:
   bool operator()(const char *val1, const char *val2) const{
      return std::string(val1) == std::string(val2);
   }
};



int main() {

   std::unordered_map<const char*, string, myhash, myequal> mymap;
   mymap["abc"] = "abcd";
   mymap["cba"] = "dcba";
   std::cout << mymap["abc"] << std::endl;
   return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接