C++ 什么会使std::map找不到它的一个键?

C++ 什么会使std::map找不到它的一个键?,c++,c++11,dictionary,std,C++,C++11,Dictionary,Std,我有一个std::map,它将const char*键与int值相关联: std::map<const char*, int> myMap; 但是at函数抛出std::out\u of_range异常,这意味着它找不到元素myMap.find(“zero”)的想法也一样,因为它在映射的末尾返回一个迭代器 但最让人毛骨悚然的是,关键确实在地图中,如果就在调用at函数之前,我打印地图的内容如下: for (auto it = myMap.begin(); it != myMap.en

我有一个std::map,它将
const char*
键与
int
值相关联:

std::map<const char*, int> myMap;
但是
at
函数抛出
std::out\u of_range
异常,这意味着它找不到元素
myMap.find(“zero”)
的想法也一样,因为它在映射的末尾返回一个迭代器


但最让人毛骨悚然的是,关键确实在地图中,如果就在调用
at
函数之前,我打印地图的内容如下:

for (auto it = myMap.begin(); it != myMap.end(); it++)
{
    std::cout << (*it).first << std::endl;
}
for(auto-it=myMap.begin();it!=myMap.end();it++)
{

std::cout您有指向字符的指针映射,而不是字符串。映射查找基于指针值(地址),而不是指向的值。在第一种情况下,其中“零”如果在映射中找到,则编译器已经执行了一些字符串合并,并且正在为两个相同的字符串使用一个字符数组。这不是语言所要求的,而是一种常见的优化。在第二种情况下,如果找不到字符串,则未执行此合并(可能您的代码位于不同的源模块中),因此映射中使用的地址与插入的地址不同,因此找不到


若要解决此问题,请在映射中存储std::string对象,或在映射声明中指定一个比较,以便根据字符串而不是地址进行排序。

映射的键是
char*
。因此映射比较函数将尝试比较原始指针值,而不是c样式的char字符串等价性检查。因此,请声明映射具有
std::string
作为键


如果您不想处理
std::string
并且仍然希望使用相同的功能来提高时间复杂度,那么可以尝试使用复杂的数据结构。请看一些实现,例如。

指向相同字符串的指针是否保证具有相同的地址?我有一个std::map,将常量字符键与int值关联:*--如果您希望密钥是字符串,请使用字符串:
std::map
。我觉得太愚蠢了……我忘了std::map在内部使用运算符,我还以为使用了
strcmp
。。。
int value = myMap.at("zero");
for (auto it = myMap.begin(); it != myMap.end(); it++)
{
    std::cout << (*it).first << std::endl;
}