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