相同的键(使用malloc创建)添加两次以映射

时间:2016-06-22 07:22:34

标签: c++ malloc stdmap

如何在地图中添加两次相同的密钥? 如果值被更改,它是否应该覆盖该值?

static map<const char *, int> lMap;
    const char * msg = "hhhhh";

    char *buf = (char *) malloc(5);
    strcpy(buf, msg);

    lMap.insert(make_pair(buf, 85));
    buf = (char *) calloc(5, sizeof (char));

    strcpy(buf, msg);
    lMap.insert(make_pair(msg, 85));

    cout << "size: " << lMap.size() << endl;
    map<const char *, int>::const_iterator it2;
    for (it2 = lMap.begin(); it2 != lMap.end(); ++it2) {
        cout << it2->first << " | " << it2->second << endl;
    }

打印结果:

size: 2
hhhhh | 85
hhhhh | 85

3 个答案:

答案 0 :(得分:2)

const char*是一个指针。将两个指针与<进行比较,比较它们指向的地址。默认情况下,std::map使用<来比较密钥。这意味着两个不同的const char*对象是不同的键,即使它们在被解释为以空字符结尾的字符串时恰好包含相同的数据。

你正在编写C ++,而不是C.如果你想要一个字符串,请使用std::string,而不是一个指向某些东西的指针,这些东西有望成为一个空终止的缓冲区。

答案 1 :(得分:1)

地图中没有两次相同的密钥。地图的关键是char *(即指针)。您有两个不同的指针值碰巧指向相同的字符串。

答案 2 :(得分:1)

     static map<const char *, int> lMap;

上述声明将int映射到const char*而非int映射到value pointed by const char*

地图不关心键指向什么,它只关心有两个不同的键,因此有两个条目。