如何找到多维std::array的大小?
How to find size of multidimensional std::array?
我有一个多维的 std::array
并正在寻找合适的(方便和有效的)方法来找到它的 大小(以单元格数或字节数计)
size()
returns只有最后一个尺寸大小(理解为)
std::array<std::array<std::array<std::array<double, 2>, 3>, 6>, 100> my_array;
my_array.size(); // returns 100
虽然数组的大小在编译时是已知的,但我希望避免使用 #define SIZE_OF_MY_ARRAY
或全局变量,因为我正在寻找一种比使用数组传递大小更好的方法(如 "old" arrays, not std array), or informing others to use the defined term.
我也比较喜欢no每次都计算
也许这两个首选项对于多维数组是不可能的?
如何有效地找到 my_array
的整体大小?我正在使用 c++11.
您可以使用 constexpr
绑定到维度的变量,然后使用这些变量计算所需的数量。
constexpr int n1 = 2;
constexpr int n2 = 3;
constexpr int n3 = 6;
constexpr int n4 = 100;
std::array<std::array<std::array<std::array<double, n1>, n2>, n3>, n4> my_array;
constexpr int myArraySize = n1*n2*n3*n4;
怎么样
sizeof(my_array)/sizeof(double);
编写一个在编译时计算这个的小实用程序并不难。
template<typename T> struct arr_sz {
static constexpr std::size_t size = sizeof(T);
};
template<typename T, std::size_t N>
struct arr_sz<std::array<T, N>> {
static constexpr std::size_t size = N * arr_sz<T>::size;
};
上面应该解开任何实际深度的嵌套数组定义,并评估用于存储 T
的字节大小,排除所有可能的填充。
使用它的一个例子是
std::array<std::array<std::array<std::array<double, 2>, 3>, 6>, 100> my_array;
constexpr auto sz = arr_sz<decltype(my_array)>::size;
static_assert(sz == sizeof(double) * 2 * 3 * 6 * 100, "");
你可能会看到 live。
您可以使用递归来计算它的大小:
template<typename T>
size_t get_array_full_size(T &val) { // for the last array type (double in this case)
return 1;
}
template<typename T, size_t Len>
size_t get_array_full_size(std::array<T, Len> &arr) {
return get_array_full_size(arr[0]) * arr.size();
}
int main() {
std::array<std::array<std::array<std::array<double, 2>, 3>, 6>, 100> my_array;
std::cout << get_array_full_size(my_array) << std::endl;
return 0;
}
类似于 @KorelK 的方法。递归模板函数将停止时
class std::array
is primitive type 的模板。
#include <array>
#include <type_traits> // std::is_fundamental_v
template<typename Type, std::size_t N>
std::size_t overall_size(const std::array<Type, N>&)
{
if constexpr(std::is_fundamental_v<Type>) return N;
else return N * overall_size(Type{});
}
我有一个多维的 std::array
并正在寻找合适的(方便和有效的)方法来找到它的 大小(以单元格数或字节数计)
size()
returns只有最后一个尺寸大小(理解为)
std::array<std::array<std::array<std::array<double, 2>, 3>, 6>, 100> my_array;
my_array.size(); // returns 100
虽然数组的大小在编译时是已知的,但我希望避免使用 #define SIZE_OF_MY_ARRAY
或全局变量,因为我正在寻找一种比使用数组传递大小更好的方法(如 "old" arrays, not std array), or informing others to use the defined term.
我也比较喜欢no每次都计算
也许这两个首选项对于多维数组是不可能的?
如何有效地找到 my_array
的整体大小?我正在使用 c++11.
您可以使用 constexpr
绑定到维度的变量,然后使用这些变量计算所需的数量。
constexpr int n1 = 2;
constexpr int n2 = 3;
constexpr int n3 = 6;
constexpr int n4 = 100;
std::array<std::array<std::array<std::array<double, n1>, n2>, n3>, n4> my_array;
constexpr int myArraySize = n1*n2*n3*n4;
怎么样
sizeof(my_array)/sizeof(double);
编写一个在编译时计算这个的小实用程序并不难。
template<typename T> struct arr_sz {
static constexpr std::size_t size = sizeof(T);
};
template<typename T, std::size_t N>
struct arr_sz<std::array<T, N>> {
static constexpr std::size_t size = N * arr_sz<T>::size;
};
上面应该解开任何实际深度的嵌套数组定义,并评估用于存储 T
的字节大小,排除所有可能的填充。
使用它的一个例子是
std::array<std::array<std::array<std::array<double, 2>, 3>, 6>, 100> my_array;
constexpr auto sz = arr_sz<decltype(my_array)>::size;
static_assert(sz == sizeof(double) * 2 * 3 * 6 * 100, "");
你可能会看到 live。
您可以使用递归来计算它的大小:
template<typename T>
size_t get_array_full_size(T &val) { // for the last array type (double in this case)
return 1;
}
template<typename T, size_t Len>
size_t get_array_full_size(std::array<T, Len> &arr) {
return get_array_full_size(arr[0]) * arr.size();
}
int main() {
std::array<std::array<std::array<std::array<double, 2>, 3>, 6>, 100> my_array;
std::cout << get_array_full_size(my_array) << std::endl;
return 0;
}
类似于 @KorelK 的方法。递归模板函数将停止时
class std::array
is primitive type 的模板。
#include <array>
#include <type_traits> // std::is_fundamental_v
template<typename Type, std::size_t N>
std::size_t overall_size(const std::array<Type, N>&)
{
if constexpr(std::is_fundamental_v<Type>) return N;
else return N * overall_size(Type{});
}