boost::range 機能一覧

使った機能の覚書。
間違いや分かりづらい部分があったらツッコミをお願いします。


[boost]
ver 1.44.0
Chapter 1. Range 2.0

boost::adaptors::transformed

range を走査する際に、操作を行う

#include <boost/range/algorithm/transform.hpp>
int to_double(int n){
    return n + n;
}

int array[] = {0, 1, 2, 3, 4};
array|boost::adaptors::transformed(to_double); // to_doble を返しての値を返す
// こう書くことも出来る
boost::adaptors::transform(array, to_double);

boost::random_shuffle(range)

range の中身をランダムで入れ替える。

#include <boost/range/algorithm/random_shuffle.hpp>

int array[] = {0, 1, 2, 3, 4};
boost::random_shuffle(array); // array == {4, 1, 3, 2, 0}

繰り返し使用する場合は、std::srand で乱数の種を設定する。

#include <ctime>
#include <boost/range/algorithm/random_shuffle.hpp>

std::srand( unsigned (std::time(NULL)) );  // 時間を種とする

int array[] = {0, 1, 2, 3, 4};
boost::random_shuffle(array); // 実行時によって変わる

boost::count(range, value)

range 内の value に等しい数を返す

#include <boost/range/algorithm/count.hpp>

int array[] = {0, 0, 0, 1, 2, 3};
assert(boost::count(array, 0) == 3); // 0 の数を数える

boost::count_if(range, func)

func(value_t) == true の数を返す

#include <boost/range/algorithm/count_if.hpp>

// 偶数の数を計算
int array[] = {0, 1, 2, 3, 4, 5};
assert(boost::count_if(array, [](int n)->bool{return n % 2 == 0;}) == 3);

boost::join(range1, range2)

range1 と range2 を結合した range を返す

int array1[] = {0, 1, 2};
int array2[] = {3, 4, 5};
boost::join(array1, array2); // {0, 1, 2, 3, 4, 5}

boost::adaptors::filter(range, func)

func(value_t) == true の要素だけを抽出した range を返す

#include <boost/range/adaptor/filtered.hpp>

using boost::adaptors::filtered;

// 偶数だけを抽出
int array[] = {0, 1, 2, 3, 4, 5};
filter(array, [](int n)->bool{return n % 2 == 0;});  // {0, 2, 4}
array|filtered([](int n)->bool{return n % 2 == 0;}); // こうも書ける

boost::adaptors::slice(range, n, m)

n 〜 m の間の range を返す。

#include <boost/range/adaptor/sliced.hpp>

int array[] = {0, 1, 2, 3, 4, 5};
boost::adaptors::slice(array, 1, 5);	// {1, 2, 3, 4}
array|boost::adaptors::sliced(1, 5);	// こう書くことも出来る

boost::irange(n, m, step)

基本的に boost::counting_range と同じ。
詳細はこっちを見てね。

boost::counting_range(n, m)

n〜mの間の range を返す
※mは含まれない
boost::irange と同じ動作。

#include <boost/range/counting_range.hpp>

boost::counting_range(0, 5); // {0, 1, 2, 3, 4}

boost::distance(range)

range の長さを返す。

#include <boost/range/as_array.hpp>

int array[] = {0, 1, 2, 3, 4, 5};
assert(boost::distance(array) == 6);