std::map, boost::unordered_mapは要素の型がstd::pairになるので使いにくい(ことがある)。
Boost.MultiIndexなら、キーと値、両方を持つ型を用意しておけば、以下のように書ける。
// GCC 4.5(-std=c++0x), Boost 1.44.0 #include <iostream> #include <string> #include <boost/multi_index_container.hpp> #include <boost/multi_index/ordered_index.hpp> #include <boost/multi_index/member.hpp> #include <boost/range/algorithm/for_each.hpp> #include <boost/assign/list_of.hpp> using namespace boost::multi_index; struct id_name { int id; std::string name; }; typedef multi_index_container< id_name, indexed_by< ordered_unique<member<id_name, int, &id_name::id> > > > container; int main() { const container c = boost::assign::list_of<id_name>({3, "a"})({1, "b"})({4, "c"}); boost::for_each(c, [](const id_name& x) { // pair<int, string>ではなくid_name std::cout << x.id << ',' << x.name << std::endl; }); }
走査する際にキーと値、両方ほしいようなケースでは、std::mapよりもBoost.MultiIndexの方が便利(なことがある)。
要素の参照にoperator[]()やat()が使えないため若干不便ではあるので、まだ完全に推奨はできない。
型が長いという問題は、C++03ではTypedef Templateイディオム、C++0xではTemplate Aliasesが実装されれば解決する。
あと、multi_index_containerにもinitializer_listのコンストラクタがほしいので実装しようと思ったら、Delegating Constructorがないとめんどくさそうだったので保留中。