読者です 読者をやめる 読者になる 読者になる

mapの代わりにMultiIndex

C++

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がないとめんどくさそうだったので保留中。