C++11 如何查找多维std::数组的大小?

C++11 如何查找多维std::数组的大小?,c++11,c++,multidimensional-array,size,stdarray,C++11,C++,Multidimensional Array,Size,Stdarray,我有一个多维std::array,正在寻找合适的(方便高效的)方法来查找它的大小(以单元数或字节数为单位) size() std::数组我的数组; my_array.size();//返回100 虽然数组的大小在编译时是已知的,但我希望避免使用#define size_of_MY_array或全局变量,因为我正在寻找一种比将大小传递给数组(如“old”array,而不是std array)或通知其他人使用定义的术语更好的方法 我也不希望每次都计算它 也许这两个首选项不适用于多维数组 如何有效地

我有一个多维
std::array
,正在寻找合适的(方便高效的)方法来查找它的大小(以单元数或字节数为单位)

size()

std::数组我的数组;
my_array.size();//返回100
虽然数组的大小在编译时是已知的,但我希望避免使用
#define size_of_MY_array
或全局变量,因为我正在寻找一种比将大小传递给数组(如“old”array,而不是std array)或通知其他人使用定义的术语更好的方法

我也不希望每次都计算它

也许这两个首选项不适用于多维数组


如何有效地查找
我的_数组的总体大小
?我正在使用。

您可以使用绑定到维度的
constepr
变量,然后使用这些变量来计算所需的数量

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;
constexpr int n1=2;
constexpr int n2=3;
constexpr int n3=6;
constexpr int n4=100;
std::数组my_数组;
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;
};

您可以看到。

您可以使用递归计算其大小:

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;
}
模板
size\u t get\u array\u full\u size(t&val){//用于最后一种数组类型(在本例中为双精度)
返回1;
}
模板
大小\u t获取\u数组\u完整大小(标准::数组和arr){
返回get_array_full_size(arr[0])*arr.size();
}
int main(){
std::数组my_数组;
std::cout类似于@KorelK的方法。递归模板函数将在
std::array
的类模板

()

#包括
#include//std::是基础吗
模板
std::size\u t总大小(const std::array&)
{
如果constexpr(std::is_basical_v)返回N;
else返回N*总大小(类型{});
}

我的数组.size()*我的数组[0].size()*我的数组[0][0].size()*我的数组[0][0].size()怎么样?
?字节大小为
sizeof(my数组)
,单元格大小为
my数组。size()
,双倍数量为
sizeof(my数组)/sizeof(双倍)
老实说,我不明白这个问题。如果你在编译时知道所有数组的大小,为什么不能简单地将它们相乘,即
size=2*3*6*100;
?难道
std::array
没有“头发”(没有无关信息,就像内置数组一样),即
sizeof(my_array)/sizeof(double)吗
产生元素计数?@vahancho我敢打赌,因为OP寻找的解决方案不涉及特定的索引或维度数。问题可能是标准是否保证。@PeterA.Schneider显然没有:我想OP想要从数组中提取常量,并找到一个通用的解决方案例如,可以将其编写为模板函数,该函数可用于所有
std::array
s,而不管它们的具体大小或维数。您的解决方案还将替换
size()
member函数,这显然很有用,但只适用于最后一个维度。@PeterA.Schneider Fair point。我认为StoryTeller刚刚发布了这样一个解决方案,它确实很优秀。是否有可能
arr\u sz::size/sizeof(arr\u sz::value\u type)
大于元素总数?@PeterA.Schneider-如果在计算过程中发生无符号溢出,则可能会更小。不知道怎么会更大。有趣。此函数方法似乎与StoryTeller的数据方法类似。
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, ""); 
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;
}
#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{});
}