boost::multi_index::multi_index_container
#include <iostream> #include <string> #include <boost/multi_index_container.hpp> #include <boost/multi_index/random_access_index.hpp> #include <boost/multi_index/ordered_index.hpp> #include <boost/multi_index/mem_fun.hpp> typedef boost::multi_index::multi_index_container< std::string, boost::multi_index::indexed_by< // ランダムアクセス boost::multi_index::random_access<>, // std::set のようなソート済みコンテナ boost::multi_index::ordered_non_unique< boost::multi_index::identity<std::string> >, // std::string::lenght で、ソートを行うコンテナ boost::multi_index::ordered_non_unique< boost::multi_index::const_mem_fun< std::string, std::size_t, &std::string::length > > > > container_t; int main(){ container_t array; array.push_back("crossing"); array.push_back("days"); array.push_back("black"); array.push_back("very"); array.push_back("pie"); // ランダムアクセス for( int i = 0 ; i < array.size() ; i++ ){ std::cout << array[i] << std::endl; } std::cout << std::endl; // ソート済みコンテナへのアクセス container_t::nth_index<1>::type& c1 = array.get<1>(); std::for_each(c1.begin(), c1.end(), [](std::string str){ std::cout << str << std::endl; }); std::cout << std::endl; // 文字列の長さでソートされたコンテナへのアクセス container_t::nth_index<2>::type& c2 = array.get<2>(); std::for_each(c2.begin(), c2.end(), [](std::string str){ std::cout << str << std::endl; }); std::cout << std::endl; return 0; }
[出力]
crossing days black very pie black crossing days pie very pie days very black crossing
boost::multi_index::multi_index_container は、【辞書順】や【文字列の長さでソートを行う】等の複数のデータの持ち方をしたい場合に使用します。
上のコードでは、【辞書順】と【文字列の長さ】のソート済みコンテナへアクセスを行う、multi_index_container を定義しています。
こうしておけば、アクセスする際に、ソートを行う必要がないので、コストパフォーマンスが良いです。
もう少し詳しい説明を見たい場合は、リンク先を参照してください。
[参照]
http://www.kmonos.net/alang/boost/classes/multi_index.html
http://hw001.gate01.com/eggplant/tcf/cpp/boost_multi_index_container.html