1

今回は完全なコードを表示できます。

#include <unordered_map>
#include <iostream>
#include <stdlib.h>

using namespace std;

bool mystrcmp(const char *s1, const char *s2) {
        int i = 0;
        do {
                if(s1[i] != s2[i])
                        return false;
        } while(s1[i++] != '\0');
        return true;
}

struct eqstr
{
  bool operator()(const char* s1, const char* s2) const
  {
    return mystrcmp(s1, s2);
  }
};


int main(void) {
    char buffer[5] = {'h', 'e', 'd', 'e', '\0'};
    unordered_map<char *, int , hash<char *> , eqstr> int_from_symbols;
    int_from_symbols["hede"] = 1;
    int_from_symbols["hodo"] = 2;
    unordered_map<char *, int , hash<char *> , eqstr>::const_iterator it = int_from_symbols.find(buffer);
    eqstr myeq;
    if(myeq("hede",buffer))
        fprintf(stderr, "no problem here\n");
    if(it == int_from_symbols.end())
        fprintf(stderr, "dammit\n");
    else fprintf(stderr, "%d\n", int_from_symbols[buffer]);
    return 0;
}

これは以下を出力します:

no problem here
dammit

何が起こっているのか分かりますか?

よろしくお願いします、、
Onur

4

2 に答える 2

2

問題は、hash<char *>あなたが望むことをしないということです。「文字列」を実際にハッシュすることに特化したものではなく、ポインタをハッシュとして返すだけです。

これをコードに追加すると、機能し始めます (ただし、ハッシュ関数は製品品質ではなく、デモ用です)。

namespace std
{
    template<>
    struct hash<char *> : public std::unary_function<char *, size_t>
    {
        size_t operator()(char* str) const
        { 
            size_t h = 0;
            for (; *str; ++str)
                h += *str;
            return h;
        }
    };
}
于 2009-12-25T07:17:13.313 に答える
1

ここで「char *」のいくつかのハッシュ関数アルゴリズムのレビュー:

http://www.cse.yorku.ca/~oz/hash.html

コメントの著者が言うように、上記のASCIIコードの合計は最適ではありません。

于 2012-02-25T23:29:11.143 に答える