我编写了以下代码,并对输出感到惊讶。我听说<map>
避免了密钥冲突,但这里似乎允许插入重复对。
#include<iostream>
#include<map>
using namespace std;
int main()
{
map<string,char> namemap;
namemap["yogi"]='c';
namemap.insert(pair<string,char>("yogendra",'a'));
namemap.insert(pair<string,char>("yogendra",'b'));
cout<<namemap["yogendra"]<<endl;
return 0;
}
此代码输出a
。您可以在C++ Shell上运行它。
避免碰撞是否意味着我们无法使用相同的密钥输入多对?
答案 0 :(得分:44)
具有相同键的第二个insert
是无操作。它只返回一个指向现有元素的迭代器。
std::map::insert()
有一个返回值,您应该检查。
类型为std::pair<iterator,bool>
。该对的第二个元素告诉您元素是否已插入,或者是否已存在具有相同键的现有条目。
cout << namemap.insert(pair<string,char>("yogendra",'a')).second << endl;
cout << namemap.insert(pair<string,char>("yogendra",'b')).second << endl;
答案 1 :(得分:7)
STL地图不允许使用相同的密钥。您可能想要使用多地图。
答案 2 :(得分:1)
map不会引发任何编译/运行时错误。但是在插入时,使用重复键不会插入新值,只会返回相同的退出值。它不会覆盖。 但在以下情况下,它将被覆盖。
map<char,int> m1;
m1.insert(pair <char, int> ('a', 40));
m1['a']=50;
cout << "a => " << m1.find('a')->second << '\n';
结果将为50。
在下面的示例中,它不会被覆盖。
map<char,int> m1;
m1.insert(pair <char, int> ('a', 40));
m1.insert(pair <char, int> ('a', 50));
cout << "a => " << m1.find('a')->second << '\n';
结果将是40。
在两种情况下都请记住此处的地图大小1。
cout <“ size =” << m1.size()<<'\ n'; 两种情况下均为1。