关于STL的MAP的一个问题,是BUG还是我不会用

时间:2022-11-17 00:39:32
我在利用map<char *,char *>插入两个字串时候
如果直接插入常量"ABC""1234",显示正常
但如果我给一个字符数组反复送值,然后插入这个数组,其只会插入最后一个值,非常奇怪.

而把MAP里面的char *更换成string也不会出现这个问题.

比如:
map<char *,char *> cmap;
char temp[32];

for(int i=1;i<=5;i++)
{
itoa(i,temp,10);
cmap.insert(make_pair(temp,temp));
}

输出MAP里所有的元素,仅仅只有一个
----------------
5,5


请问是为什么?

8 个解决方案

#1


明明是C++的问题,为什么总有人拿到C语言区问?

转C++

#2


map中的key值是唯一的,当你使用char*的时候,因为比较的是字符串的地址,所以可以连续的插入相同的字符串作key值!但当你使用string的时候,string重载了等于号,通过比较,key值就不能是相同的字符!

#3


楼上好像没回答正确或是刚好相反.

因为比较的是字符串的地址,所以在insert时检测到地址相同,所以只插入一个.

但当你使用string的时候,string重载了等于号,通过比较,key值就不是相同的了,因此就插入了五组pair.

#4


不光是char *,偶还试过int * ,template<T *>,都一样.

#5


你把程序改成这样,就不会了:

map<char*,char*> cmap;
char *temp[5];
for(int i=1;i<=5;i++)
{
    temp[i-1] = new char[5];
    itoa(i,temp[i-1],10);

    cmap.insert(make_pair(temp[i-1],temp[i-1]));
}
map<char *, char *>::iterator my_Itr;

for (my_Itr=cmap.begin(); my_Itr!=cmap.end(); ++my_Itr) 
{
cout<<my_Itr->first<<endl;
}

#6


map<char *,char *> cmap;
char temp[32];

for(int i=1;i<=5;i++)
{
itoa(i,temp,10);
cmap.insert(make_pair(temp,temp));
}

输出MAP里所有的元素,仅仅只有一个
----------------
5,5
-----------------------------------
make_pair(temp, temp);
temp 始终是数组的地址,没有改变。key唯一,key相同覆盖前面的值!

#7


zhouhuahai(道号"虚无") ( ) is ok

#8


map<key,value>是按照key的小于比较规则的,如果!(key1<key2) && !(key2<key1),那么key1和key2被认为是等价的。map中等价的key只有一个!

map<T*,...>中,是按照T*来比较的,
map<char *,char *> cmap;
char temp[32];
比较的是字符串的地址,而下面的代码中key都是temp,所以第一次插入是有效的,其他都是无用的。

zhouhuahai(道号"虚无") 说的“但当你使用string的时候,string重载了等于号,所以……”值得商榷,其实map并不做==或者!=比较,只做<比较。

younggundog(炼狱中的游魂) 说“key唯一,key相同覆盖前面的值!”也可以实际测试一下,到底是“第一次有效,其余的无效”还是“后一次覆盖前一次”

#1


明明是C++的问题,为什么总有人拿到C语言区问?

转C++

#2


map中的key值是唯一的,当你使用char*的时候,因为比较的是字符串的地址,所以可以连续的插入相同的字符串作key值!但当你使用string的时候,string重载了等于号,通过比较,key值就不能是相同的字符!

#3


楼上好像没回答正确或是刚好相反.

因为比较的是字符串的地址,所以在insert时检测到地址相同,所以只插入一个.

但当你使用string的时候,string重载了等于号,通过比较,key值就不是相同的了,因此就插入了五组pair.

#4


不光是char *,偶还试过int * ,template<T *>,都一样.

#5


你把程序改成这样,就不会了:

map<char*,char*> cmap;
char *temp[5];
for(int i=1;i<=5;i++)
{
    temp[i-1] = new char[5];
    itoa(i,temp[i-1],10);

    cmap.insert(make_pair(temp[i-1],temp[i-1]));
}
map<char *, char *>::iterator my_Itr;

for (my_Itr=cmap.begin(); my_Itr!=cmap.end(); ++my_Itr) 
{
cout<<my_Itr->first<<endl;
}

#6


map<char *,char *> cmap;
char temp[32];

for(int i=1;i<=5;i++)
{
itoa(i,temp,10);
cmap.insert(make_pair(temp,temp));
}

输出MAP里所有的元素,仅仅只有一个
----------------
5,5
-----------------------------------
make_pair(temp, temp);
temp 始终是数组的地址,没有改变。key唯一,key相同覆盖前面的值!

#7


zhouhuahai(道号"虚无") ( ) is ok

#8


map<key,value>是按照key的小于比较规则的,如果!(key1<key2) && !(key2<key1),那么key1和key2被认为是等价的。map中等价的key只有一个!

map<T*,...>中,是按照T*来比较的,
map<char *,char *> cmap;
char temp[32];
比较的是字符串的地址,而下面的代码中key都是temp,所以第一次插入是有效的,其他都是无用的。

zhouhuahai(道号"虚无") 说的“但当你使用string的时候,string重载了等于号,所以……”值得商榷,其实map并不做==或者!=比较,只做<比较。

younggundog(炼狱中的游魂) 说“key唯一,key相同覆盖前面的值!”也可以实际测试一下,到底是“第一次有效,其余的无效”还是“后一次覆盖前一次”

相关文章