2016-05-13 5 views
-4

C++プログラムでmap<char *, int> mのようなハッシュマップを宣言しています。しかし、それは動作していなかったので、私はUsing char* as a key in std::map から命令を守り、map<char *, int, cmp_str> mのような私のマップを宣言しました。マップのキーとしてのChar * C++

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

int main(int argc, char *argv[]) 
{ 
    map<char *, int, cmp_str> m 
    //Reading strings from a file 
    while(not end of file) 
    { 
    // char *str contains the line 
    if(m.find(str) != m.end()) {m[str]++; } 
    else {m[str] = 1;} 

    } 
} 

プログラムを実行すると、ifが挿入されていなくても最初にすべての文字列が検索されます。 map<string, int> m;を使用してみて、char *strstd::stringに変換したところ、正常に動作しました。しかし、入力ファイルは非常に大きいので、文字列を使用すると時間がかかります。 char *を使用すると、なぜそれがすべての文字列を見つけるのか分かりません。どんな助けもありがとう。

+0

あなたの質問は何ですか? –

+5

実際、['std :: map'](http://en.cppreference.com/w/cpp/container/map)は*ハッシュマップではありません。バイナリツリーです。ハッシュが必要な場合は、['std :: unordered_map'](http://en.cppreference.com/w/cpp/container/unordered_map)を使用してください。 –

+7

[MCVE](http://stackoverflow.com/help/mcve)を投稿してください。投稿したコードは*完全ではありません。 –

答えて

3

map<char *, int, cmp_str> mを使用すると、std::mapに挿入した後にマップをコピーできないため、そのバッファを変更することはできません。 std::map<std::string,int>std::stringを使用するとコピーが作成されるため、それが機能しているため、処理が遅くなります。したがって、手動で多くのバッファを作成して文字列を格納する必要があります(プログラムが遅くなります)。適切でより良い方法であるstd::stringを使用してください。

+0

それは本当です。私の弦の長さは50に固定されています。 –

+0

@CPP_NEW多分はいですが、達成しようとしていることを説明する必要があります。あなたがその新しい質問を開くことにした場合は注意してください。 – Slava

+0

私は大きなファイル(〜5GB)を持っており、各行のカウントをハッシュテーブルに保存したいと思います。現在、 'std :: string'を使用すると約10分かかります。私はそれをより速くしたいです –