C++ STLのstd::mapで、あるKeyに対応するデータの参照を取得する方法

http://codepad.org/vFVp4vmw
自分のための備忘録。
Keyに対応するValueが存在していても、していない場合にも問題なく参照が取得できるようになっています。

MapType::mapped_type の初期化処理が必要ない場合には、普通に operator[] で参照を取得できるので問題ないです。今回の様に、Valueが存在していなかった場合に初期化処理を挟みたい場合に、このようにすれば無駄なfindを行わずに初期化から参照取得までを行えます。

以下に、上記のlink先と同じコードを張っておきます。

#include <map>
#include <string>
#include <iostream>
#include <boost/shared_ptr.hpp>

typedef std::map<int, boost::shared_ptr<std::string> > MapType;
typedef MapType::mapped_type ValueType;

template<typename F>
ValueType& get(MapType& map, int tag, F f) {
	std::pair<MapType::iterator, bool> pair = map.insert(MapType::value_type(tag, ValueType()));
	ValueType& value = pair.first->second;
	if (pair.second) {
		f(value);
	}
	return value;
}

struct InitNewString {
	void operator() (ValueType& value) {
		value.reset(new std::string());
	}
};
ValueType& get(MapType& map, int tag) {
	return get(map, tag, InitNewString());
}

int main(int, char**) {
	MapType map;
	*get(map, 1) = "test code.";
	std::cout << get(map, 1) << ":" << *get(map, 1) << std::endl;
	return 0;
}