C++関連コンテナのmap同じキー要素を挿入して要素を検索する操作

4618 ワード

一、同じキー要素を挿入する操作
(1)insertメソッド
mapのキーは一意でなければなりません.mapにキーが同じですが値が異なる要素を連続的に挿入したい場合、コンパイルと実行時にエラーは発生しません.システムは、既存のキーの挿入操作を無視します.例えば、
1 map<int,int> m1;

2 m1.insert(make_pair(1,2));

3 m1.insert(make_pair(1,3));

4 for(map<int,int>::iterator mit=m1.begin();mit!=m1.end();mit++){

5     cout<<mit->first<<":"<<mit->second<<endl;

6 }

2行目と3行目のそれぞれの挿入キーは1ですが、値の異なるデータは、3行目の挿入操作を無視し、プログラムの実行結果は次のとおりです.
1:2

Insertメソッドによる挿入操作は誤解されやすい:
1.同じキーを挿入した操作はエラーとして報告される(正解:同じキーを挿入した操作はコンパイル時も実行時もエラーは報告されない)
2.同じキーを挿入したデータに対して、後の挿入操作の値が前の値を上書きします.例えば、この例の3番目の文の挿入操作で最終キーが1のデータに対応する値が3に変更されると勘違いします(正解:挿入したデータのキー値は既に存在しますが、この挿入操作は無視されます)
(2)下書き操作による
mapに要素を挿入するには、配列(関連配列)を下にすることもできます.まず、次の例を見てみましょう.
1 map<int,int> m1;

2 m1[1]=2;

3 m1[1]=3;

4 for(map<int,int>::iterator mit=m1.begin();mit!=m1.end();mit++){

5     cout<<mit->first<<":"<<mit->second<<endl;

6 }

実行結果
1:3

このコードとinsert例のコードの違いは2,3行目にすぎず、結果的に要素挿入操作の後の付与操作が前の付与操作を上書きしている.後でさらに下付き操作を分析します.
二、mapの要素を検索して読み取る
mapコンテナの最大の利点は、キー値の要素を迅速に位置決めして読み取ることができることです.
(1)下付き検索
以下のコードで示す
1 map<string,int> m1;

2 cout<<m1["abc"]<<endl;

3 m1["abc"]=8;

4 cout<<m1["abc"]<<endl;

実行結果:
0

8

上のコードから分かるように、map内の要素に配列の下付きでアクセスするのは非常に便利です.しかし、2行目の出力には疑問があるかもしれません.最初はmapが空で、存在しないキーを直接読み取ると、正常な出力結果(私たちが望んでいないかもしれません)がありますが、これまでキーに値を付けていませんでした.
下付きインデックスのメカニズムを説明する
下付きスケールでmapに存在しない要素にアクセスすると、その下付きスケールが指す新しい要素がmapに追加され、その値はタイプのデフォルト値またはデフォルト構造関数に基づいて初期化されます(intまたは0に初期化され、stringは「」に初期化されます).
(2)メソッドcount()とfind()で検索
したがって,mapにあるキー値の要素が存在するか否かを判断すると,mapに新しい要素を追加したいため,一般にはラベルを外すことで判断できない.map標準ライブラリには、あるキー値の要素が存在するか否かを判断する2つの方法が提供されています.count()方法とfind()方法は、以下の表のようになります.
map::count(k)
mapでキーkが現れる回数を返します.ここでは0(存在しません)と1(存在します)しか取れません.
map::find(k)
コンテナにkによるインデックス要素が存在する場合、その要素を指す反復器が返されます.存在しない場合は、エンドを超えた反復器を返します.
この2つの方法はmapに新しい要素を挿入しないので、mapインデックスキーを判断する場合は、この2つの方法を選択します.