【发布时间】:2025-11-26 03:10:01
【问题描述】:
我在 C++ 中为std::vector 实现了一个非常简单的flatmap 函数,但有人建议范围通常更好。这是基于向量的解决方案:
// 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 的一个微不足道的组合,但我正在努力弄清楚如何将它们连接在一起。
【问题讨论】: