STL <map> позволяет дублировать пары?

Я написал следующий код и был удивлен выходом. Я слышал, что <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. Вы можете запустить его на С++ Shell.

Не удается ли избежать столкновения, что мы не можем вводить несколько пар с одним и тем же ключом?

Ответ 1

Второй insert с тем же ключом является no-op. Он просто возвращает итератор, указывающий на существующий элемент.

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;

Ответ 2

Карта Stl не позволяет использовать одни и те же ключи. Возможно, вам захочется пойти на мульти-карту.!