尝试从std :: map中查找const char *键时出错

时间:2014-06-25 01:27:21

标签: c++ map

我有一个像这样声明的地图:

std::map<const char*, const char*> map2D;

地图由API函数的输出填充,该函数返回const char*

map2D.insert(std::pair<const char*, const char*>(TempA, TempB));

现在有50个TempA值和50个TempB值,并且有一个名为“months”的键。当我搜索这个密钥时,我得到“找不到”。例如:

std::map<const char*, const char*>::iterator it;
it = map2D.find("months");

if (it != map2D.end()) 
{
    std::cout << "Found " << it->first << " " << it->second << '\n';
}
else 
{
    std::cout << "Not found\n";
}  

但是当我这样做的时候:

map2D.insert(std::pair<const char*, const char*>("months", "June");  

我可以找到相应的月份。搜索网络后,我了解此问题可能与const char*的使用有关。任何人都可以进一步澄清这一点吗?

1 个答案:

答案 0 :(得分:10)

比较两个const char*的相等性并不符合您的想法;它比较指针值,而不是指针指向的字符串。使用字符串文字时,这可能偶尔会“起作用”,但您无法知道即使其中包含相同字符的两个字符串文字也将存储在同一地址中。您必须提供一个调用strcmp的自定义比较器,以便可靠地工作。

使用std::map<std::string, std::string>可以更好地 您的第三方API为您提供const char*并不重要:你可以简单地从那些构建std::string

此容器将具有明确所有权和生命周期语义的元素,并自动正确排序。简而言之,你所有的问题都会消失。

如果您确实需要存储const char*,请注意这样的要求非常罕见,只有在您准备好的情况下才应该进行短暂考虑使用解释性注释来丢弃您的代码,详细说明容器安全的方式和原因;暗示:几乎肯定不是。