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