boost::irange

基本的な使い方は、boost::counting_range と同じ。
違う点は、ステップの設定ができる。

boost::irange(0, 5);  // {0, 1, 2, 3, 4}
bosst::irange(0, 10); // {0, 2, 4, 6, 8}


ただし、ここで注意する点がある。

boost::for_each(boost::irange(0, 9, 2), [](int n){
    std::cout << n;
});

と、した場合、

0246

が出力される。
これは、内部で(若干、意味は違うが)『2ずつ進む、irange(0, 8)』に置き換えられているからだ。
(返す範囲に 8 は含まれない)
うーん、直感で分かりづらいな…。
しかし、これではまる人はいそうな気がするな・・・。


ちなみに同じ動作を行う、pstade::oven::steps は予想通りの動きをしてくます。

boost::for_each(boost::irange(0, 9)|pstade::oven::steps(2), [](int n){
    std::cout << n;
});

出力

02468


[boost]
ver 1.44.0
[参照]
http://d.hatena.ne.jp/faith_and_brave/20100819/