使用 const char* 作为映射/unordered_map的键
Using const char* as key for map/unordered_map
如何创建直接使用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;
如果您将使用指针作为映射键,它将根据指针地址比较键,相同的键将被视为不同。因此,在处理纯指针时,您必须创建自己的比较函数,因此您最好像其他答案建议的那样在纯指针上使用一些包装器。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 使用一个考虑到std::map中键值的滚动或换行的键
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 允许从 std::map 的密钥窃取资源?
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 使用字符数组作为 Map 中的键
- C++如何创建 std::map
- C++ equivalent to Java Map getOrDefault?
- 从其他容器中移动构造"std::map"
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- C++中 std::map 的运行时复杂度是多少?
- unordered map -在c++ std::unordered_map中预分配桶