C#/Scala/Python/Ruby/F#でデータ処理はどう違うのか? - @IT。「C++でもやってやれないことはない」というわけで自分の知るライブラリで当てはめてみました。
件の記事では、データ処理を3つに分けて考えています。
- パイプライン型のデータ処理
- イテレータ・パターン
- 二重ループ
「パイプライン型データ処理」はPStade.OvenやBoost.Range Adaptorが該当します。
どちらも、|演算子を並べて処理していき、遅延評価(forループなどの時点で評価)されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <iostream> //#include <pstade/oven/filtered.hpp> #include <boost/range/adaptor/filtered.hpp> int main() { //using namespace pstade::oven; using namespace boost::adaptors; int src[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 偶数の要素だけを抽出する。 auto r = src | filtered([](int i) { return (i % 2) == 0; }); for (auto x : r) { std::cout << x << std::endl; } } |
なお、STLとの互換性もあります。上のコードの変数rに対して、std::copy(boost::begin(r), boost::end(r), …);のようにSTLのアルゴリズムを適用したり、その逆(開始・終端のイテレータの組から|演算可能なオブジェクトを作る)を行ったりできます。
次、「イテレータ・パターン」と件の記事で呼んでいるものを実現するものとして、PStade.Ovenのblock(スレッドを使う)とHamigaki.Coroutineのジェネレータがあります。
最後の「二重ループ」も、該当するようなものはほとんどないです。この前書いたOvenのconcatenatedがC#でいうところの.SelectMany(x => x)のようなものであることくらいしか思い浮かびません。余談ですが、.NET (LINQ)でいうところのGroupByやJoinに相当するものも欲しいと思ったことがあります。
探せばもっとふさわしいものもあるとは思いますが、自分の知っている限りではこんな感じでした。
スポンサード リンク |
この記事のカテゴリ
- C++ ⇒ データ処理? C++で