有人可以帮我理解这个吗?
我已经创建了一个char字符串的映射作为键,而int作为来自二维char数组的值.我看到地图中插入了重复的条目!
为了进一步测试,我向地图添加了两个相同值的char字符串(也在代码中,注释了),并且只添加了其中一个.
void countstr(char words[][NUM_OF_STR])
{
map<char*, int> mwords;
cout<<"ORIG"<<endl;
for(int i = 0; i < NUM_OF_STR; i ++)
{
cout<<words[i]<<endl;
mwords.insert(pair<char*, int>(words[i], 0));
cout<<mwords.size()<<endl;
}
map<char*, int>::iterator itr;
cout<<endl<<"MAP"<<endl;
for(auto i = mwords.begin(); i != mwords.end(); i ++)
{
cout<<i->first<<"\t"<<i->second<<endl;
}
return;
}
int main()
{
char words[NUM_OF_STR][5] = { "abc", "pqr", "xyz", "abc", "pqr" };
/*map<char*, int> mwords;
mwords.insert(pair<char*, int>("abc", 1));
cout<<mwords.size()<<endl;
mwords.insert(pair<char*, int>("abc", 2));
cout<<mwords.size()<<endl;*/
countstr(words);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
ORIG
abc
1
pqr
2
xyz
3
abc
4
pqr
5
MAP
abc 0
pqr 0
xyz 0
abc 0
pqr 0
Run Code Online (Sandbox Code Playgroud)
如果你比较words[0],words[3]你会发现它们不一样.这是因为他们是指针,所以运营商==,<等会看你的C字符串,而不是内容的地址.
因为它们的内容是相同的,这是可能的-但不能保证-他们的地址将是相同的太(这就是生活与字符串文字事实).在你的情况下,它们是不一样的,所以键在逻辑上是不同的,并且两个元素都被接受.
指针不是容器.
您可以通过提供自定义比较器来使用地图strcmp,也可以只使用std::string(或std::string_view)键.:)
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |