23

我编写了以下代码,并对输出感到惊讶。我听说<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上运行它。

避免冲突是否意味着我们不能使用相同的密钥输入多对?

4

3 回答 3

64

具有相同密钥的第二个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;
于 2012-05-24T06:14:20.540 回答
13

STL 映射不允许使用相同的键。您可能想为此使用多地图。

于 2012-05-24T06:15:29.310 回答
3

使用重复键插入值时,地图不会引发任何编译/运行时错误。但是在插入时,使用重复键它不会插入新值,它只会返回相同的退出值。它不会覆盖。但在以下情况下,它将被覆盖。

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。

于 2018-11-01T16:13:10.053 回答