multi_index_containerから範囲指定して値を取り出す

multi_index_container::range()メンバ関数を使用することによって、指定範囲の値を取り出すことができます。


range()で返されるのは、範囲を示すイテレータのpairですが、
Boost.Rangeはイテレータのpairも扱うことができるのでRange AlgorithmやBoost.Foreachに適用することができます。

#include <iostream>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/range/algorithm/for_each.hpp>

using namespace boost::multi_index;
namespace bll = boost::lambda;

void disp(int x) { std::cout << x << std::endl; }

int main()
{
    multi_index_container<int> c;

    for (int i = 0; i < 10; ++i)
        c.insert(i * 3);

    boost::for_each(c.range(5 <= bll::_1, bll::_1 <= 20), &disp);
}
6
9
12
15
18

また、range()にはunboundedを指定することによって、抽出条件のどちらかを省略することができます。

c.range(unbounded, bll::_1 <= 20); // x <= 20
c.range(5 <= bll::_1, unbounded);  // 5 <= x

両方にunboundedも指定はできますが、とくに使い道はないでしょう。



参照:
Retrieval of ranges