我正在使用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
我不确定为什么第三种情况不起作用,我应该怎样做才能使其发挥作用。 我调试了上面的代码来观察传递的值,但我仍然无法解决问题。
谢谢!
答案 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。