解压缩元组列表
unzip a list of tuples
知道如何实现这个功能吗?
template <class ... Ts>
auto unzip(const list<tuple<Ts...>> & l)
{
...
}
此函数将接收一个元组列表,并将 return 一个列表元组。第一个列表将包含 get<0>(t)
的元素,依此类推。
我可以遍历元组的项,当然也可以遍历列表。但我不知道如何声明这样的 tuple<list<T1>, list<T2> ...>
有什么线索或参考吗?
我会这样做:
template<typename... Ts, size_t... is>
auto unzip_impl(list<tuple<Ts...>> const& l, std::index_sequence<is...>)
{
tuple<list<Ts>...> ret;
for(auto const& el : l) {
std::initializer_list<int> {
(std::get<is>(ret).push_back(std::get<is>(el)), 0)...
};
}
return ret;
}
template <class... Ts>
auto unzip(const list<tuple<Ts...>> & l)
{
return unzip_impl(l, std::index_sequence_for<Ts...>{});
}
此外,更多带有折叠表达式的 C++17-y 版本:
template<typename... Ts, size_t... is>
auto unzip_impl(list<tuple<Ts...>> const& l, std::index_sequence<is...>)
{
tuple<list<Ts>...> ret;
for(auto const& el : l) {
(std::get<is>(ret).push_back(std::get<is>(el)),...);
}
return ret;
}
知道如何实现这个功能吗?
template <class ... Ts>
auto unzip(const list<tuple<Ts...>> & l)
{
...
}
此函数将接收一个元组列表,并将 return 一个列表元组。第一个列表将包含 get<0>(t)
的元素,依此类推。
我可以遍历元组的项,当然也可以遍历列表。但我不知道如何声明这样的 tuple<list<T1>, list<T2> ...>
有什么线索或参考吗?
我会这样做:
template<typename... Ts, size_t... is>
auto unzip_impl(list<tuple<Ts...>> const& l, std::index_sequence<is...>)
{
tuple<list<Ts>...> ret;
for(auto const& el : l) {
std::initializer_list<int> {
(std::get<is>(ret).push_back(std::get<is>(el)), 0)...
};
}
return ret;
}
template <class... Ts>
auto unzip(const list<tuple<Ts...>> & l)
{
return unzip_impl(l, std::index_sequence_for<Ts...>{});
}
此外,更多带有折叠表达式的 C++17-y 版本:
template<typename... Ts, size_t... is>
auto unzip_impl(list<tuple<Ts...>> const& l, std::index_sequence<is...>)
{
tuple<list<Ts>...> ret;
for(auto const& el : l) {
(std::get<is>(ret).push_back(std::get<is>(el)),...);
}
return ret;
}