oven::adjacent_transformed

昨日の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まとめ