zip、map/reduce、flatten是比较有意思的通用算法。zip在boost::iterator里有了,map/reduce是用transfom、accumulate、inner_product实现的。
flatten就没找到了,那就造个吧:
template<typename T, typename C>
constexpr void do_flatten(const C & c, T & ret)
{
for (const auto & x : c)
{
if constexpr (is_same<typename T::value_type, typename C::value_type>::value)
{
ret.push_back(x);
}
else
{
do_flatten(x, ret);
}
}
}
template<typename T, typename ... C>
T flatten( C && ... c)
{
T ret;
auto cookie = {(do_flatten(c, ret),0)...};
return ret;
}
测试:
vector<vector<int>> v{{1, 2}, {3, 4, 5}, {6,7,8,9}};
vector<int> r = flatten<vector<int>>(v);
for(auto x : r)
{
cout << x << " ";
}
当然了,如果想实现为适配成iterator的方式,如boost::range,能缓式计算,就要多好多代码了,感觉C++新语法就帮助有限了。
本文介绍了一种在C++中实现通用flatten算法的方法,该算法能够将多级嵌套的容器扁平化为单一级别的容器。通过递归方式处理嵌套元素,并利用模板元编程来判断类型是否相同。

780

被折叠的 条评论
为什么被折叠?



