【问题标题】:Char * as key in a map C++ [closed]Char * 作为地图 C++ 中的键 [关闭]
【发布时间】:2016-09-09 18:35:03
【问题描述】:

我在我的 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&lt;string, int&gt; m; 并将 char *str 转换为 std::string 时,它工作正常。但是输入文件太大了,我用string的时候需要很多时间。我不确定为什么当我使用char * 时它会找到所有字符串。任何帮助将不胜感激。

【问题讨论】:

  • 那么你的问题是什么?
  • 其实std::map不是hash映射,而是二叉树。如果你想要一个哈希,你应该使用std::unordered_map
  • 发布MCVE。您发布的代码不完整
  • 这是不正确的重复
  • @JoachimPileborg unordered_map&lt;char *, int&gt; 没有帮助

标签: c++ hash


【解决方案1】:

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

【讨论】:

  • 确实如此。我的字符串长度固定为 50。有更快的方法吗?
  • @CPP_NEW 也许是的,但你需要解释你想要达到的目标。请注意您是否决定这样做打开新问题。
  • 我有一个大文件 (~5GB),我想将每行的计数存储在哈希表中。目前,我使用std::string 大约需要 10 分钟。我想要更快
  • @CPP_NEW 它取决于您文件中的数据。如果有很多重复,您可能需要使用基数树 - en.wikipedia.org/wiki/Radix_tree
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多