如果直接插入常量"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++
转C++
#2
map中的key值是唯一的,当你使用char*的时候,因为比较的是字符串的地址,所以可以连续的插入相同的字符串作key值!但当你使用string的时候,string重载了等于号,通过比较,key值就不能是相同的字符!
#3
楼上好像没回答正确或是刚好相反.
因为比较的是字符串的地址,所以在insert时检测到地址相同,所以只插入一个.
但当你使用string的时候,string重载了等于号,通过比较,key值就不是相同的了,因此就插入了五组pair.
因为比较的是字符串的地址,所以在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;
}
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相同覆盖前面的值!
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相同覆盖前面的值!”也可以实际测试一下,到底是“第一次有效,其余的无效”还是“后一次覆盖前一次”
map<T*,...>中,是按照T*来比较的,
map<char *,char *> cmap;
char temp[32];
比较的是字符串的地址,而下面的代码中key都是temp,所以第一次插入是有效的,其他都是无用的。
zhouhuahai(道号"虚无") 说的“但当你使用string的时候,string重载了等于号,所以……”值得商榷,其实map并不做==或者!=比较,只做<比较。
younggundog(炼狱中的游魂) 说“key唯一,key相同覆盖前面的值!”也可以实际测试一下,到底是“第一次有效,其余的无效”还是“后一次覆盖前一次”
#1
明明是C++的问题,为什么总有人拿到C语言区问?
转C++
转C++
#2
map中的key值是唯一的,当你使用char*的时候,因为比较的是字符串的地址,所以可以连续的插入相同的字符串作key值!但当你使用string的时候,string重载了等于号,通过比较,key值就不能是相同的字符!
#3
楼上好像没回答正确或是刚好相反.
因为比较的是字符串的地址,所以在insert时检测到地址相同,所以只插入一个.
但当你使用string的时候,string重载了等于号,通过比较,key值就不是相同的了,因此就插入了五组pair.
因为比较的是字符串的地址,所以在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;
}
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相同覆盖前面的值!
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相同覆盖前面的值!”也可以实际测试一下,到底是“第一次有效,其余的无效”还是“后一次覆盖前一次”
map<T*,...>中,是按照T*来比较的,
map<char *,char *> cmap;
char temp[32];
比较的是字符串的地址,而下面的代码中key都是temp,所以第一次插入是有效的,其他都是无用的。
zhouhuahai(道号"虚无") 说的“但当你使用string的时候,string重载了等于号,所以……”值得商榷,其实map并不做==或者!=比较,只做<比较。
younggundog(炼狱中的游魂) 说“key唯一,key相同覆盖前面的值!”也可以实际测试一下,到底是“第一次有效,其余的无效”还是“后一次覆盖前一次”