1

char*をキーとして、 を としてvector<int>持つunordered_map を作成したいと思います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」を2回挿入すると:

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);

ベクトルの各要素が 0 または 1 であるサイズ 2 のベクトルを持つ 1 つの「temp」キーを持つ代わりに、最終的なマップには、「temp」という名前の 2 つのキーと、各キーにサイズ 1 のベクトルがあります。

ここに詳細な画像: ここに画像の説明を入力

どうすればこれを回避できますか? 前もって感謝します

4

1 に答える 1

3

ハッシュ関数の問題ではなく、 の等価性の問題char*です。ポインターの比較に依存しており、デバッガーの監視変数から、さまざまな「一時」リテラルのポインターの場所が異なるため、等しくないことがわかります。

文字列を実際に比較する等価ファンクターを定義し、それをunordered_map.

char*または、キーとしてを使用する代わりに を使用してstd::string、この問題を完全に回避してください。

于 2013-03-27T18:02:15.107 に答える