我有一个flatmap
用 C++ 实现的非常简单的函数 for std::vector
,但有人建议范围通常更好。这是基于矢量的解决方案:
// 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)
我假设在 range-v3 世界中,我的目标是将上述内容编写为:
auto result = v | flatmap(fn) | filter(fn2) | transform(fn3);
感觉flatmap
应该只是 , 和 的一个微不足道的组合,views::for_each
但我正在努力弄清楚如何将它们全部连接在一起。yield_from
transform