使用const char*做map的key

如果想使用字符串做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());
posted @ 2021-11-18 19:59  Demon90s  阅读(529)  评论(0编辑  收藏  举报