boost::bimapsのメモ

boostのbimapを使うと双方向アクセス可能なmapを使えるようになる.要素には,通常のsetのみではなく,multisetやvectorなどが利用できる.以下がサンプル.

#include <iostream>
#include <string>

#include <boost/bimap/bimap.hpp>
#include <boost/bimap/multiset_of.hpp>
#include <boost/foreach.hpp>

typedef boost::bimaps::multiset_of<int>                         int_set;
typedef boost::bimaps::bimap<std::string, int_set>              bimap;
typedef boost::bimaps::bimap<std::string, int_set>::value_type  value_t;

int
main(int argc, char *argv[])
{
        bimap bm;
        int   n;

        // 挿入
        bm.insert(value_t("アムロ",   15));
        bm.insert(value_t("カミーユ", 16));
        bm.insert(value_t("刹那",     16));
        bm.insert(value_t("ウラキ",   19));
        bm.insert(value_t("ブライト", 19));
        bm.insert(value_t("シャア",   20));
        bm.insert(value_t("ハマーン", 20));
        bm.insert(value_t("ディアナ", 1000));

        // 左側からアクセス
        std::cout << "from left" << std::endl;

        n = bm.left.at("シャア");
        std::cout << "  シャア: " << n << std::endl;
        n = bm.left.at("アムロ");
        std::cout << "  アムロ: " << n << std::endl;

        // 右側からアクセス
        // 右側はmultisetなのでrangeアクセスを行う
        std::cout << "from right" << std::endl;

        BOOST_FOREACH(bimap::right_reference rp, bm.right.equal_range(19)) {
                std::cout << "  " << rp.second << ": " << rp.first << std::endl;
        }

        // 要素の削除
        bm.right.erase(20);

        // 全要素アクセス
        std::cout << "dump all elements" << std::endl;

        bimap::right_iterator it;
        for (it = bm.right.begin(); it != bm.right.end(); ++it) {
                std::cout << "  " << it->second << ": " << it->first
                          << std::endl;
        }

        return 0;
}


出力

from left
  シャア: 20
  アムロ: 15
from right
  ウラキ: 19
  ブライト: 19
dump all elements
  アムロ: 15
  カミーユ: 16
  刹那: 16
  ウラキ: 19
  ブライト: 19
  ディアナ: 1000