【问题标题】:C++ map::find char * vs. char []C++ map::find char * vs. char []
【发布时间】:2012-04-05 20:41:13
【问题描述】:

我正在使用 C++ 映射在我的程序中实现字典。我的函数获取一个结构作为参数,并且应该返回基于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

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

谢谢!

【问题讨论】:

    标签: c++ map std


    【解决方案1】:

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

    要解决此问题,请使用std::string 或为char* 定义一个比较器。

    【讨论】:

    • 其实是实现定义了两个相同字符的字符串字面量是否有相同的地址。所以"test" == "test" 可能是假的。此外,字符串文字可能会重叠,因此 "confusion" + 3 == "fusion" 可能为真。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      就像提到的那样,您是在比较地址而不是值。我想链接这篇文章:

      Is a string literal in c++ created in static memory?

      由于所有文字都具有相同的地址,这就解释了为什么即使底层类型仍然是 const char *,您对字符串文字的比较仍然有效(但取决于编译器,它可能并非总是如此)

      【讨论】:

        【解决方案4】:

        这是因为 buf[5] 分配了 buf 指向的内存,但是当你使用 'p' 指针时,它指向的内存位置与 map 使用的内存位置相同。所以总是在键中使用 std::string 而不是指针变量。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-03-10
          • 2012-08-21
          • 1970-01-01
          • 2020-08-01
          • 2021-12-05
          • 2013-10-04
          • 1970-01-01
          相关资源
          最近更新 更多