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

Boost.MultiIndexの練習

C++

ここでは、ランダムアクセスと、辞書順という2つの
アクセス方法・ソート順を持つコンテナを作成しています。

#include <iostream>
#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/member.hpp>
#include <boost/multi_index/identity.hpp>

using namespace boost::multi_index;

typedef multi_index_container< 
    int,
    indexed_by<
        random_access<>,
        ordered_unique<identity<int> >
    >
> Container;

typedef Container::nth_index<0>::type Array;
typedef Container::nth_index<1>::type Set;

int main()
{
    Container c;
    Array& ar = c.get<0>();
    Set&   st = c.get<1>();

    st.insert(1);
    st.insert(3);
    st.insert(2);
    st.insert(5);
    st.insert(4);

    // c : デフォルトがrandom_accessなのでランダムアクセスできる
    for (std::size_t i = 0; i < c.size(); ++i)
        std::cout << c[i] << std::endl;
        // 1, 3, 2, 5, 4の順に出力される

    // ar : インデックスがrandom_accessなのでランダムアクセスできる
    for (std::size_t i = 0; i < ar.size(); ++i)
        std::cout << ar[i] << std::endl;
        // 1, 3, 2, 5, 4の順に出力される

    // st : インデックスがordered_uniqueなので辞書順
    for (Set::const_iterator it = st.begin(); it != st.end(); ++it)
        std::cout << *it << std::endl;
        // 1, 2, 3, 4, 5の順に出力される

    // st : ランダムアクセスはできない
    for (std::size_t i = 0; i < st.size(); ++i)
        std::cout << st[i] << std::endl; // エラー!
}