乐闻世界logo
搜索文章和话题

How to use char* as a key in std:: map

2 个月前提问
2 个月前修改
浏览次数19

1个答案

1

使用 char* 作为 std::map 的键是不推荐的,尽管从语法上来说这是合法的。主要原因是 std::map 默认使用 std::less 来比较键值,而 std::less 对于 char* 类型的键,会根据指针地址而非指向的字符串内容进行比较。这通常不是我们想要的行为,因为即使两个不同的 char* 变量指向的字符串内容相同,它们在内存中的地址可能不同,从而导致 std::map 无法正确地根据字符串内容进行键值对的查找和排序。

例如,考虑以下代码片段:

cpp
#include <map> #include <iostream> int main() { std::map<char*, int> myMap; char* key1 = "key"; char* key2 = "key"; myMap[key1] = 100; myMap[key2] = 200; std::cout << "Number of elements: " << myMap.size() << std::endl; // 输出 2 std::cout << "Value at key1: " << myMap[key1] << std::endl; // 输出 100 std::cout << "Value at key2: " << myMap[key2] << std::endl; // 输出 200 }

在这个例子中,即使 key1key2 指向的字符串内容相同,它们可能存储在不同的地址。因此,myMap 认为它们是不同的键,并创建了两个不同的键值对。

为了解决这个问题,推荐的做法是使用 std::string 作为键的类型。std::string 类在 std::map 中会根据字符串的实际内容进行比较,这通常是我们期望的行为。这样可以避免因为指针地址不同而导致的问题。以下是修改后的代码:

cpp
#include <map> #include <iostream> #include <string> int main() { std::map<std::string, int> myMap; std::string key1 = "key"; std::string key2 = "key"; myMap[key1] = 100; myMap[key2] = 200; std::cout << "Number of elements: " << myMap.size() << std::endl; // 输出 1 std::cout << "Value at key: " << myMap[key1] << std::endl; // 输出 200 }

在这个修改后的例子中,myMap 正确地将 key1key2 视为同一个键,并且只存储了一个键值对。这样做更加安全且符合逻辑。

2024年7月19日 18:01 回复

你的答案