C ++地图问题

时间:2011-03-13 09:16:45

标签: c++ string map

我有一个

 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放到地图上。

4 个答案:

答案 0 :(得分:8)

如果将map<char*, int>替换为map<string, int>,问题可能会消失。这是因为比较两个char*对象只会比较指针而不是字符,而比较两个string对象会比较字符。

(不要忘记#include <string>)。

答案 1 :(得分:1)

似乎current->u.bj.target->namechar*。所以当你写

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到类的第三个模板参数你写了解引用指针并比较值