Char *作为地图C ++的关键

时间:2016-05-13 14:04:18

标签: c++ hash

我在我的C ++程序中声明了一个像map<char *, int> m这样的哈希映射。但它没有用,所以我按照Using char* as a key in std::map的说明进行操作 并宣布我的地图为map<char *, int, cmp_str> m。我的程序看起来像这样

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 *时它会找到所有字符串。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

当您使用playySlides()时,在将其插入map<char *, int, cmp_str> m后无法修改该缓冲区,因为地图不会复制数据而是指针本身。当您使用std::map std::map<std::string,int>时,确实会制作副本,这就是为什么它会起作用而且速度较慢。因此,您需要手动创建许多缓冲区并在其中存储字符串(这会使您的程序变慢)或使用std::string这是正确和更好的方式。