使用 const char* 作为映射/unordered_map的键

Using const char* as key for map/unordered_map

本文关键字:unordered map 的键 映射 const char 使用      更新时间:2023-10-16

如何创建直接使用const char*作为键的map/unordered_map?

如果我使用map<std::string,..>,那么在每个解析map["abc"] = ...上都会创建一个新的std::string对象。这会导致分配内存、创建字符串对象并将字符串复制到其中的大量开销。

如何声明直接使用const char*而没有任何开销的 map 对象?

您可以使用std::string_view

std::map<std::string_view, int> Map;
Map["abc"] = 1; // no allocation necessary to store "abc"

它基本上是字符串对象的包装器。它是一个视图,这意味着它不拥有字符串,因此不会复制和分配内存来存储字符串。

请注意,对于小字符串(以及文本(,由于 SSO,std::string不会分配太多,因此开销最小。始终在优化之前进行测量。

作为 Rakete1111string_view答案的替代方案,您可以为地图配备合适的比较器(和哈希器,用于unordered_map(:

struct LesserString
{
bool operator() (const char *lhs, const char *rhs) const
{
return std::strcmp(lhs, rhs) < 0;
}
};
struct HashString
{
std::size_t operator() (const char *arg) const
{
return however_you_want_to_hash_the_string();
}
};
struct EqualString
{
bool operator() (const char *lhs, const char *rhs) const
{
return !strcmp(lhs, rhs);
}
};
std::map<const char*, WhateverValue, LesserString> m1;
std::unorderd_map<const char*, WhateverValue, HashString, EqualString> m2;

如果您将使用指针作为映射键,它将根据指针地址比较键,相同的键将被视为不同。因此,在处理纯指针时,您必须创建自己的比较函数,因此您最好像其他答案建议的那样在纯指针上使用一些包装器。