我有一张这样声明的地图:
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*
。谁能进一步澄清这一点?
比较两个const char*
是否相等并不能满足您的要求。它比较指针值,而不是指针指向的字符串。对于字符串文字,这有时可能会“起作用”,但是您无法知道两个字符串文字(即使其中包含相同的字符)也将存储在相同的地址。您必须提供一个调用的自定义比较器,strcmp
以使其可靠地工作。
你多用更好std::map<std::string, std::string>
。第三方API提供给您并不重要const char*
:您可以简单地std::string
从中构造。
此容器将具有具有清晰所有权和生存期语义的元素,并会自动正确排序。简而言之,您所有的问题都将消失。
如果你仍真的需要存储const char*
,要知道,这样的要求是极其罕见的,应该只有当你准备好你的垃圾代码解释性意见正是如何以及为什么你的容器是安全的细节,甚至被认为是飞快; 提示:几乎可以肯定不是。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句