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

Mar*_*k.A 5 c++ std map

我正在使用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
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

hmj*_*mjd 9

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

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

  • 实际上,它是实现定义的,具有相同字符的两个字符串文字是否具有相同的地址.所以``test'=="test"`可能是假的.此外,字符串文字可能重叠,因此"混淆"+ 3 =="融合"​​可能是真的. (2认同)

Rus*_*ove 5

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

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