如何将元组元组中的数据分组为向量元组
How to group data in tuples of tuples into a tuple of vectors
我想将元组中的元组数据分组为向量元组。
给定的是包含数据的元组的元组。有多个重复类型,即数据应分组到每个唯一类型的向量中。
到目前为止 boost::mp11
是我找到的最优雅的构建类型的方法
std::tuple<std::vector<T1>, std::tuple<std::vector<T2>, ...>
基于传入的参数包
std::tuple<std::tuple<some_data>, std::tuple<std::tuple<some_more_data>, ...
使用 mp_unique
和 mp_transform
获取每个唯一类型的向量。
如果您知道 std::
左右的替代方案(可选),我们会很高兴。
我无法找到将元组元素填充到匹配向量中的方法?
我会很兴奋,找到一个类似折叠表达式的方式来做到这一点。
这个例子应该有助于更好地理解我的想法。
template <typename T> using vector_of = std::vector<T>;
static constexpr auto tuple_to_vector(auto&&... Vs) noexcept {
// merged_tuple = std::tuple<int, double, int, char, int, float, char, float, double>
auto merged_tuple = std::tuple_cat(std::forward<decltype(Vs)>(Vs)...);
// vector_t = std::tuple<std::vector<int>, std::vector<double>, std::vector<char>, std::vector<float>>
using vector_t = boost::mp11::mp_transform<vector_of, boost::mp11::mp_unique<decltype(merged_tuple)>>;
vector_t vec;
// how to add merged_tuple elements to vec
// resulting in
// std::tuple< std::vector<int>{1,3,2}, std::vector<double>{2.0,3.0}, std::vector<char>{'b','c'}, std::vector<float>{3.0f,2.0f}>
return std::move(vec);
};
int main() {
constexpr auto vec = tuple_to_vector(
std::make_tuple(1,2.0,3),
std::make_tuple('b',2,3.0f),
std::make_tuple('c',2.0f,3.0)
);
// expecting
// vec = std::tuple<
// std::vector<int>{1,3,2},
// std::vector<double>{2.0,3.0},
// std::vector<char>{'b','c'},
// std::vector<float>{3.0f,2.0f}
// >
return 42;
}
可以用std::apply
展开merged_tuple
的元素,用std::get
根据类型提取vector_t
中对应的vector
的元素,并填充到 vector
到 push_back
std::apply([&vec](auto... args) {
(std::get<std::vector<decltype(args)>>(vec).push_back(args), ...);
}, merged_tuple);
注意 vec
even in C++20 since its allocation is non-transient. If you really want to construct a constexpr
tuple, then you can use std::array
since the size of the array can be obtained at compile time. Here is a demo 将结果 vec
转换为相应的 std::array
类型。
我想将元组中的元组数据分组为向量元组。 给定的是包含数据的元组的元组。有多个重复类型,即数据应分组到每个唯一类型的向量中。
到目前为止 boost::mp11
是我找到的最优雅的构建类型的方法
std::tuple<std::vector<T1>, std::tuple<std::vector<T2>, ...>
基于传入的参数包
std::tuple<std::tuple<some_data>, std::tuple<std::tuple<some_more_data>, ...
使用 mp_unique
和 mp_transform
获取每个唯一类型的向量。
如果您知道 std::
左右的替代方案(可选),我们会很高兴。
我无法找到将元组元素填充到匹配向量中的方法? 我会很兴奋,找到一个类似折叠表达式的方式来做到这一点。
这个例子应该有助于更好地理解我的想法。
template <typename T> using vector_of = std::vector<T>;
static constexpr auto tuple_to_vector(auto&&... Vs) noexcept {
// merged_tuple = std::tuple<int, double, int, char, int, float, char, float, double>
auto merged_tuple = std::tuple_cat(std::forward<decltype(Vs)>(Vs)...);
// vector_t = std::tuple<std::vector<int>, std::vector<double>, std::vector<char>, std::vector<float>>
using vector_t = boost::mp11::mp_transform<vector_of, boost::mp11::mp_unique<decltype(merged_tuple)>>;
vector_t vec;
// how to add merged_tuple elements to vec
// resulting in
// std::tuple< std::vector<int>{1,3,2}, std::vector<double>{2.0,3.0}, std::vector<char>{'b','c'}, std::vector<float>{3.0f,2.0f}>
return std::move(vec);
};
int main() {
constexpr auto vec = tuple_to_vector(
std::make_tuple(1,2.0,3),
std::make_tuple('b',2,3.0f),
std::make_tuple('c',2.0f,3.0)
);
// expecting
// vec = std::tuple<
// std::vector<int>{1,3,2},
// std::vector<double>{2.0,3.0},
// std::vector<char>{'b','c'},
// std::vector<float>{3.0f,2.0f}
// >
return 42;
}
可以用std::apply
展开merged_tuple
的元素,用std::get
根据类型提取vector_t
中对应的vector
的元素,并填充到 vector
到 push_back
std::apply([&vec](auto... args) {
(std::get<std::vector<decltype(args)>>(vec).push_back(args), ...);
}, merged_tuple);
注意 vec
constexpr
tuple, then you can use std::array
since the size of the array can be obtained at compile time. Here is a demo 将结果 vec
转换为相应的 std::array
类型。