如何解决将多维 c++ std::array 转换为多维向量
我有一个多维 c++ std::array
(我不知道它有多少维),我想把它变成一个多维向量。我想到了一个函数,如果传递了 std::array
,则返回一个向量,否则会引发错误。我很确定最快的方法是使用函数递归,但我实际上不知道如何实现这一点。
为了清楚起见,我的输入数组可能是这样的一维数组:[1,2,3]
;但也有更多这样的维度:
[
[
[1,3]
[4,5,6]
],[
[7,8,9],[10,11,12]
]
]
解决方法
这样的事情应该可以工作。
#include <array>
#include <type_traits>
#include <vector>
#include <algorithm>
template<typename T>
inline constexpr bool IsArray = false;
template<typename T,std::size_t S>
inline constexpr bool IsArray<std::array<T,S>> = true;
template<typename T>
auto ToVector(const T& arr) {
static_assert(IsArray<T>,"Expected an std::array!");
if constexpr (IsArray<typename T::value_type>) {
using U = decltype(ToVector(arr.front()));
std::vector<U> vector{};
vector.reserve(arr.size());
std::transform(arr.begin(),arr.end(),std::back_inserter(vector),[](const auto& a) { return ToVector(a);});
return vector;
}
else {
return std::vector<typename T::value_type>{ arr.begin(),arr.end() };
}
}
int main() {
std::array<std::array<std::array<int,4>,3>,2> arr{
std::array < std::array<int,3 > {
std::array<int,4>{1,2,3,4},std::array<int,4>{4,5,6,7},4>{8,9,10,11},},std::array < std::array<int,4>{12,13,14,15},4>{16,17,18,19},4>{20,21,22,23},};
const auto vector = ToVector(arr);
}
请注意,尽管名称 std::is_array
对 std::array
返回 false,因此我们需要一个 IsArray
助手。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。