2016-05-13 46 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分钟。我希望它更快 –