簡體   English   中英

std :: hash專門化功能仍未由std :: unordered_map使用

[英]std::hash specialization remains unused by std::unordered_map

我試圖通過為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

對於無序映射( ref ),您需要兩件事:

  1. 哈希函數
  2. 相等性的比較功能

因此,您有(1)似乎可以使用,但是地圖必須檢查const char *是否相等,這將演變為指針比較。 為此,您可以指定一個自定義比較器( ref ):

struct cmp_str
{
   bool operator()(char const *a, char const *b)
   {
      return std::strcmp(a, b) == 0;
   }
};

std::unordered_map<const char*, int, std::hash<const char *>, cmp_str> BlahBlah;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM