pstade::oven::zipped
#include <iostream> #include <boost/tuple/tuple_io.hpp> #include <pstade/oven/zipped.hpp> #include <pstade/oven/copied.hpp> #include <pstade/oven/io.hpp> #include <pstade/oven/identities.hpp> #include <boost/array.hpp> int main(){ namespace oven = pstade::oven; int array1[] = {0, 1, 2, 3, 4}; char array2[] = {'a', 'b', 'c', 'd', 'e'}; // 標準出力されるように oven::identities をアダプト std::cout << boost::make_tuple(array1|oven::identities, array2|oven::identities) << std::endl; std::cout << (boost::make_tuple(array1, array2)|oven::zipped) << std::endl; return 0; }
[出力]
({0,1,2,3,4} {a,b,c,d,e}) {(0 a),(1 b),(2 c),(3 d),(4 e)}
pstade::oven::zipped は、tuple
当然ですが、両方の range の長さは、同じでないとダメです。
boost::tuple<boost::array<int, 5>, boost::array<char, 5> > ↓↓↓↓↓ boost::array<boost::tuple<int, char>, 5>
応用すればループカウンタなんかを付けることも出来るみたい。
std::string str("JOKER"); boost::for_each( boost::make_tuple(str, oven::counting(0, str.size()))|oven::zipped, [](boost::tuple<char, int> data){ int index; char c; boost::tie(c, index) = data; std::cout << index << ":" << c << std::endl; } );
[出力]
0:J 1:O 2:K 3:E 4:R
ただ、boost::fusion::vector には対応してないみたい。
pstade::oven::fuzipped 使えばいいそうです。
// oven::fuzipped を使う。
boost::fusion::make_vector(array1, array2)|oven::fuzipped;
最近、露骨に手抜きなのがバレバレっすね…。
コメントありがとうございます。
[pstade]
ver 1.04.3
[参照]
http://d.hatena.ne.jp/faith_and_brave/20100503/