gpt4 book ai didi

c++ - 如何使用 rangev3 范围实现平面图

转载 作者:可可西里 更新时间:2023-11-01 17:36:48 27 4
gpt4 key购买 nike

我有一个用 C++ 为 std::vector 实现的非常简单的 flatmap 函数,但有人建议范围通常更好。这是基于 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_eachyield_fromtransform 的简单组合,但我正在努力研究如何将它们连接在一起。

最佳答案

IIUC,您的flatmap 函数只不过是range-v3 的view::for_each。尝试:

使用命名空间范围;
自动结果 = v | View ::for_each(fn) | to_vector;

HTH

关于c++ - 如何使用 rangev3 范围实现平面图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36051851/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com