首页 >后端开发 >C++ >为什么 `char*` 键在 `std::map` 中失败,如何修复?

为什么 `char*` 键在 `std::map` 中失败,如何修复?

Linda Hamilton
Linda Hamilton原创
2024-12-26 04:49:15541浏览

Why Do `char*` Keys Fail in `std::map`, and How Can I Fix It?

std::map 中 char* 键的困惑

在处理像 std::map 这样基于哈希的容器时,理解 key类型至关重要。使用 char* 作为地图键时会出现一个特殊问题,如以下代码所示:

std::map<char*, int> g_PlayerNames;

此代码尝试将玩家名称 (char*) 存储为键,并将相应的整数存储为值。然而,当使用已知名称搜索条目时,比较会失败,从而导致意外结果。

根本原因在于 char 作为键的特殊性质。 std::map 默认使用小于运算符 (<) 比较键。然而,对于 char 指针,此比较检查指针地址而不是它们指向的字符串。

要解决此问题,我们需要提供一个对实际字符串进行操作的自定义比较函数,而不是指针。引入如下所示的结构体使我们能够做到这一点:

struct cmp_str
{
    bool operator()(char const *a, char const *b) const
    {
        return std::strcmp(a, b) < 0;
    }
};

通过提供此自定义比较函数,我们指示 std::map 根据它们引用的字符串来比较 char* 键,确保正确的键查找和插入期间匹配。

因此,我们不使用原始映射定义,而是对其进行修改以包含比较函数:

map g_PlayerNames;

通过此修改,玩家名称查找和更新逻辑功能按预期运行,利用比较函数根据字符串内容匹配 char* 键。

以上是为什么 `char*` 键在 `std::map` 中失败,如何修复?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn