使用 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 }
在这个例子中,即使 key1
和 key2
指向的字符串内容相同,它们可能存储在不同的地址。因此,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
正确地将 key1
和 key2
视为同一个键,并且只存储了一个键值对。这样做更加安全且符合逻辑。
2024年7月19日 18:01 回复