我有一个
map<char*, int> labels;
那表现出一些我根本无法理解的行为。对于一个索引,它会返回不同的值,因为我非常确定它们是相同的索引。下面是一个例子:
在我的程序中,我添加了一个条目如下:
labels[current->u.bj.target->name] = blockNum + 1;
//Test code
if (blockNum + 1 == 9)
{
stringtest = current->u.bj.target->name;
cout << "Condition Met" << endl;
testCond = true;
}
稍后在我的程序中,我执行以下操作
if ((*stringtest) == (*current->u.bj.target->name))
cout << "Why is this printing the correct val " <<labels[stringtest] << endl;
branchTarget = labels[current->u.bj.target->name];
cout << "Why is this value different" << branchTarget << endl;
从cout语句中可以看出,labels[stringtest]
返回9,但labels[current->u.bj.target->name]
返回0,尽管它们都指向同一个事实。任何人都可以给我一个想法是什么错误/如何解决它?我几乎是肯定的,我从来没有把0放到地图上。
答案 0 :(得分:8)
如果将map<char*, int>
替换为map<string, int>
,问题可能会消失。这是因为比较两个char*
对象只会比较指针而不是字符,而比较两个string
对象会比较字符。
(不要忘记#include <string>
)。
答案 1 :(得分:1)
似乎current->u.bj.target->name
是char*
。所以当你写
if ((*stringtest) == (*current->u.bj.target->name))
您取消引用两个char*
并比较他们指向的char
。所以你只是比较两个字符串的第一个字符!
另外,如果你不小心,使用指针作为map
的键是危险的。如果您将指针传递给相同的字符串,而不是另一个恰好包含相同字符的字符串,Lookup将只能正常工作。如果您想要后一种行为,请使用std::string
,就像FredOverflow已经建议的那样。
答案 2 :(得分:1)
本声明
((*stringtest) == (*current->u.bj.target->name))
比较各个数组中包含的字符的第一个字符。所以地图没有问题,你只是将“苹果与橘子”进行比较。我建议将std::map< char*, int >
替换为std::map< std::string, int >
。
答案 3 :(得分:0)
任何类型的指针都将通过内存地址进行比较(默认情况下),因此它们返回匹配的唯一方法是指针指向同一个对象。正如其他人所说,绕过这个的一个好方法是使用带有比较运算符的容器(比如std :: string),或者你可以将比较函数重载,这是std :: map到类的第三个模板参数你写了解引用指针并比较值