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* 键,确保正确的键查找和插入期间匹配。
因此,我们不使用原始映射定义,而是对其进行修改以包含比较函数:
mapg_PlayerNames; 通过此修改,玩家名称查找和更新逻辑功能按预期运行,利用比较函数根据字符串内容匹配 char* 键。
以上是为什么 `char*` 键在 `std::map` 中失败,如何修复?的详细内容。更多信息请关注PHP中文网其他相关文章!