昨日のTwitterでのやりとりのメモ:
{1, 2, 3, 4, 5}というリストから{(1, 2), (2, 3), (3, 4), (4, 5)}という
要素をひとつずらした組のリストを作るのに、oven::adjacent_transformedを使います。
#include <iostream> #include <vector> #include <pstade/oven/initial_values.hpp> #include <pstade/oven/adjacent_transformed.hpp> #include <pstade/oven/algorithm.hpp> #include <boost/tuple/tuple.hpp> #include <boost/tuple/tuple_io.hpp> #include <boost/mpl/identity.hpp> namespace oven = pstade::oven; struct pack { template <class T> struct result; template <class F, class T1, class T2> struct result<F(T1, T2)> : boost::mpl::identity<boost::tuples::tuple<T1, T2> > {}; template <class T1, class T2> boost::tuples::tuple<T1, T2> operator()(T1 a1, T2 a2) const { return boost::make_tuple(a1, a2); } }; void disp(boost::tuples::tuple<int, int> t) { std::cout << t << std::endl; } int main() { const std::vector<int> v = oven::initial_values(1, 2, 3, 4, 5); oven::for_each(v | oven::adjacent_transformed(pack()), &disp); }
(1 2) (2 3) (3 4) (4 5)
これは、範囲がソート済みかどうかの判定などに使えたりしますね。
以下、Twitterのログ。
oven::adjacent_transform - Togetterまとめ