如果想使用字符串做map的key,通常使用std::string,但使用std::string可能会存在一个内存分配的过程。比如有如下查询:
m.find("key");
首先会从"key"构造一个std::string,然后再应用查询。
内存分配的开销是比较大的,那么可以使用const char*去避免吗?比如:
std::map<const char *, int> m;
这样是行不通的,因为默认情况下,const char*会被当成一个地址的值,尽管两个字符串内容一样,但地址可能不一样。那么就是不同的key。以下代码通过验证:
char key1[] = "one";
char key2[] = "one";
std::map<const char*, int> char_int_map;
char_int_map[key1] = 1;
char_int_map[key2] = 1;
assert(2 == char_int_map.size());
解决之道是提供一个新的比较方法(可调用对象)来初始化map,让map使用自定义的比较方法来对比const char*。
struct LesserString
{
bool operator() (const char* lhs, const char* rhs) const
{
return strcmp(lhs, rhs) < 0;
}
};
std::map<const char*, int, LesserString> char_int_map2;
char_int_map2[key1] = 1;
char_int_map2[key2] = 1;
assert(1 == char_int_map2.size());