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;
}

このコードはを出力しますaC++シェルで実行できます。

衝突を回避するということは、同じキーで複数のペアを入力できないことを意味しますか?

4

3 に答える 3

64

同じキーを持つ2番目insertはノーオペレーションです。既存の要素を指すイテレータを返すだけです。

std::map::insert()戻り値があり、これを確認する必要があります。

タイプstd::pair<iterator,bool>です。ペアの2番目の要素は、要素が挿入されているかどうか、または同じキーを持つ既存のエントリがすでに存在していたかどうかを示します。

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 に答える