我有一个多维c++std::array
(我不知道它有多少个维度),我想把它变成一个多维向量。我认为在一个函数中,如果传递了std::array
,就会返回一个向量,否则就会抛出错误。我确信最快的方法是使用函数递归,但实际上我不知道如何实现
需要明确的是,我的输入数组可以是1D,如下所示:[1,2,3]
;但也有更多维度的东西,比如
[
[
[1,2,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, 4>, 3 > {
std::array<int, 4>{1,2,3,4},
std::array<int, 4>{4,5,6,7},
std::array<int, 4>{8,9,10,11},
},
std::array < std::array<int, 4>, 3 > {
std::array<int, 4>{12,13,14,15},
std::array<int, 4>{16,17,18,19},
std::array<int, 4>{20,21,22,23},
},
};
const auto vector = ToVector(arr);
}
注意,尽管名称std::is_array
对std::array
返回false,所以我们需要一个IsArray
助手。