如何在地图中添加两次相同的密钥? 如果值被更改,它是否应该覆盖该值?
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
答案 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*
。
地图不关心键指向什么,它只关心有两个不同的键,因此有两个条目。