【问题标题】:C++ map problemC++地图问题
【发布时间】:2011-03-13 09:16:45
【问题描述】:

我有一个

 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-&gt;u.bj.target-&gt;name] 返回 0,尽管它们都指向同一事物。谁能给我一个想法什么是错的/如何解决它?我几乎可以肯定我从来没有把 0 放在地图上。

【问题讨论】:

    标签: c++ string map


    【解决方案1】:

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

    (别忘了#include &lt;string&gt;)。

    【讨论】:

      【解决方案2】:

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

      if ((*stringtest) == (*current->u.bj.target->name))
      

      您正在取消引用两个 char*s 并比较它们指向的 chars。所以你只是比较两个字符串的第一个字符!

      此外,如果您不小心,将指针用作指向 map 的键是很危险的。只有将指针传递给相同的字符串,而不是传递给恰好包含相同字符的另一个字符串,查找才能正常工作。如果您想要后一种行为,请使用 std::string,就像 FredOverflow 已经建议的那样。

      【讨论】:

        【解决方案3】:

        此声明

        ((*stringtest) == (*current->u.bj.target->name)) 
        

        比较各个数组中包含的字符的第一个字符。所以地图没有问题,你只是在比较“苹果和橘子”。我建议将std::map&lt; char*, int &gt; 替换为std::map&lt; std::string, int &gt;

        【讨论】:

          【解决方案4】:

          任何类型的指针都会(默认情况下)通过内存地址进行比较,因此它们返回匹配的唯一方法是指针指向同一个对象。正如其他人所说,解决此问题的一个好方法是使用带有比较运算符(如 std::string)的容器,或者您可以重载比较函数,它是 std::map 的第三个模板参数到一个类你写的是取消引用指针并比较值

          【讨论】:

            猜你喜欢
            • 2011-07-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多