2016-05-13 41 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;} 

    } 
} 

當我執行程序時,如果發現所有的字符串,但第一,即使它們不被插入。當我嘗試使用map<string, int> m;並將char *str轉換爲std::string時,它工作正常。但是輸入文件非常大,當我使用字符串時需要很多時間。我不確定爲什麼它會在我使用char *時發現所有字符串。任何幫助,將不勝感激。

+0

那麼你的問題是什麼? –

+5

其實['std :: map'](http://en.cppreference.com/w/cpp/container/map)不是* hash *映射,它是一個二叉樹。如果你想要一個散列,你應該使用['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分鐘。我希望它更快 –