C ++ map :: find char *与char []

时间:2012-04-05 20:41:14

标签: c++ map std

我正在使用C ++ map在我的程序中实现一个字典。我的函数将结构作为参数获取,并应根据structure.name成员char named[32]返回关联值。以下代码演示了我的问题:

map <const char *, const char *> myMap;
myMap.insert(pair<const char *, const char *>("test", "myTest"));

char *p = "test";
char buf[5] = {'\0'};
strcpy(buf, "test");

cout << myMap.find(p)->second << endl; // WORKS
cout << myMap.find("test")->second << endl; // WORKS
cout << myMap.find(buf)->second << endl; // DOES NOT WORK

我不确定为什么第三种情况不起作用,我应该怎样做才能使其发挥作用。 我调试了上面的代码来观察传递的值,但我仍然无法解决问题。

谢谢!

4 个答案:

答案 0 :(得分:8)

指针比较,而非字符串比较,将由map执行以定位元素。前两个工作,因为"test"是一个字符串文字,并具有相同的地址。最后一个不起作用,因为buf"test"的地址不同。

要修复,请使用std::string或为char*定义比较器。

答案 1 :(得分:5)

地图键是指针,而不是值。你的所有文字“测试”字符串共享存储,因为编译器很聪明,因此它们的指针是相同的,但buf是一个不同的内存地址。

您需要使用具有值相等语义的映射键,例如std::string,而不是char*

答案 2 :(得分:1)

就像提到的那样,你在比较地址而不是价值。我想链接这篇文章:

Is a string literal in c++ created in static memory?

由于所有文字具有相同的地址,这解释了为什么你的字符串文字比较有效,即使基础类型仍然是const char *(但取决于编译器,它可能不总是如此)

答案 3 :(得分:0)

因为你通过buf [5]分配buf指向的内存,但是当你使用'p'指针时,它指向map所使用的相同内存位置。所以总是在key而不是指针变量中使用std :: string。