C#/Scala/Python/Ruby/F#でデータ処理はどう違うのか? - @IT。「C++でもやってやれないことはない」というわけで自分の知るライブラリで当てはめてみました。

件の記事では、データ処理を3つに分けて考えています。

  • パイプライン型のデータ処理
  • イテレータ・パターン
  • 二重ループ

「パイプライン型データ処理」はPStade.OvenBoost.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++で