2015-04-05 65 views
2

我正在嘗試使用自定義鍵創建映射,該鍵是對象的指針地址,如前所述。使用指針地址作爲鍵的Unordered_map

我需要的地址,因爲現在它是唯一相關的方式來比較兩個對象。

從我的理解,這樣做的正確方法是使用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*

這是做這件事的正確方法嗎?

+0

您發現'__gnu_cxx'這兩個前導下劃線?這基本上意味着它是一個*私人*符號。如果您的編譯器和標準庫對於C++ 11來說比較陳舊,那麼使用'std :: tr1'命名空間及其頭文件,並且如果您的編譯器和庫不支持TR1,則使用Boost。 – 2015-04-05 13:42:53

+0

至於使用指針作爲關鍵,不要。即使你有兩個指向內存的字符串,除了它們是兩個不同的分配,它不會工作。哈希是在*指針*上完成的,而不是它們指向的內容。 – 2015-04-05 13:45:30

+0

@JoachimPileborg感謝您的評論,但我現在必須使用指針作爲鍵。至於'__gnu_cxx',你是對的。 – Itzik984 2015-04-05 13:54:30

回答

3

使用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; 
}