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