std::vector
のC++で実装されたかなり単純なflatmap
関数がありますが、一般的に範囲がより良いことが示唆されています。ここでは、ベクトルベースのソリューションです:rangev3の範囲を使用してフラットマップを実装する方法
// flatmap: [A] -> (A->[B]) -> [B]
template<typename T, typename FN>
static auto flatmap(const std::vector<T> &vec, FN fn)
-> std::vector<typename std::remove_reference<decltype(fn(T())[0])>::type> {
std::vector<typename std::remove_reference<decltype(fn(T())[0])>::type> result;
for(auto x : vec) {
auto y = fn(x);
for(auto v : y) {
result.push_back(v);
}
}
return result;
};
また、私はイテレータを使用することが示唆されているが、それは機能の素敵なコンポーザを破る:
map(filter(flatmap(V, fn), fn2), fn3)
私はレンジ-V3の世界でそれを引き受けます
auto result = v | flatmap(fn) | filter(fn2) | transform(fn3);
それはちょうどviews::for_each
の些細な組み合わせでなければなりませんflatmap
のように感じ、:私は上記のように書き込みを目指すことと思いますとtransform
がありますが、私はそれらをすべて一緒にフックする方法を考えるのに苦労しています。