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++新语法就帮助有限了。