std::map - insert 時の無駄な find を防ぐ

std::map 使用時に、
「挿入させたいキーが既に登録されているかチェックしたい」
ってことがよくある。
そんな時は insert の戻り値を使用する。

std::map<int, char> hige;
hige.insert(1, 'a');
...
std::map<int, char>::_Pairib pib = hige.insert(1, 'b');
if (!pib.second) {
  // キーが重複している
}

[説明]
_Pairib のデータ構造を覗いてみる。

// _Pairib = _Pair + i(terator) + b(ool)
typedef pair<iterator, bool> _Pairib;
_Pairib::iterator // insert 時のキーの iterator が格納
_Pairib::bool   // 新規登録ができたら true となる

というわけで、_Pairib::bool でキーが重複しているかがチェックできる。
find を用いても可能だが、insert 時も find しているので冗長になってしまう。

iterator = hige.find(1); // ここで find
if (iterator == hige.end()) {
  // キーが重複している
}
hige.insert(1, 'b');     // キー重複チェックする為、ここでも find

因みに、あるキーのデータを(登録|データの変更)したいだけなら [](インデクサ)を用いた方が可読性は高い。

hige[1] = 'b';

insert を用いると以下になる。

hige.insert(std::make_pair(1, map<int, char>::mapped_type())).first->second = 'b';


参考リンク
http://d.hatena.ne.jp/yamadila/20081113/1226547302