std::mapのインデクサとinsert

mapの挙動でメモメモ。

typedef std::map Map;
Map map;

// operator []は要素が無ければ挿入される
map["hoge"] = 0;
map["fuga"] = 1;

printf("hoge=%d\n", map["hoge"]);
printf("fuga=%d\n", map["fuga"]);


単純に要素が無ければ挿入する処理を今まで以下のよーに書いちゃってましたが

Map::iterator i = map.find("hoge");
if (i == map.end()) {
map.insert(Map::value_type("hoge", 0));
}
これを先の一文
map["hoge"] = 0;
で済ませてしまえる。
ただし、operator [] はconstメソッド版が無いので注意。


また、insertは、重複する要素があったらその要素のイテレータを返すようで。

map["hoge"] = 0;

Map::_Pairib pair = map.insert(Map::value_type("hoge", 1));
printf("key=%s, val=%d\n", pair.first->first.c_str(), pair.first->second);

pair = map.insert(Map::value_type("piyo", 2));
printf("key=%s, val=%d\n", pair.first->first.c_str(), pair.first->second);


operator []は、この処理を利用して以下のよーなコードらしーです。

// map["hoge"] = 0;
(*((map.insert(Map::value_type("hoge", Map::mapped_type()))).first)).second = 0;


無知さゆえに冗長なコードを書いてた自分爆発しろ。


ちなみに std::tr1::unordered_map でも同じように書ける模様。


参考:
http://d.hatena.ne.jp/KZR/20080907/p2
http://www.cppll.jp/cppreference/cppmap_details.html#insert