Boost.Rangeでdropを実装してみた

なぜかBoost.Range.Adaptorsにdropがなかったので作ってみた。slicedでdropを書けなくはないんですが、長さがわからないrangeに適用できないのが問題です。実際はtakeを先に作ったんですが、dropの方が短かったので…。

boost::copy(input | taco::drop(5), output.begin());

のように書けます。g++ 4.5必須。VC系列は動くか見てません。

Random Access Rangeである必要はない*1ので、このような処理も書けます。

std::stringstream ss("1 2 3 4 5 6 7 8 9 10");
boost::copy(boost::make_iterator_range(
                std::istream_iterator<int>(ss),
                std::istream_iterator<int>())
            | taco::drop(5),
            output.begin());

*1:ただしRandom Access Rangeの方が実装効率が良いです

続きを読む