zoukankan      html  css  js  c++  java
  • 使用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());
    
  • 相关阅读:
    模板复习
    [BZOJ4016][FJOI2014]最短路径树问题(dijkstra+点分治)
    Stirling数,Bell数,Catalan数,Bernoulli数
    [BZOJ2820]YY的GCD
    [BZOJ2154]Crash的数字表格
    [HAOI2011]Problem b&&[POI2007]Zap
    [BZOJ2588][SPOJ10628]Count on a tree
    [ONTAK2010]Peaks
    [HNOI2010]弹飞绵羊
    [HNOI2004]宠物收养所
  • 原文地址:https://www.cnblogs.com/demon90s/p/15574136.html
Copyright © 2011-2022 走看看