如何找到多维std :: array的大小?

时间:2019-07-10 10:03:39

标签: c++ c++11 multidimensional-array size stdarray

我有一个多维std::array,正在寻找一种正确的(便捷而有效的)方式来找到其 size (以单元数或字节为单位)

size()仅返回最后的尺寸尺寸(可以理解)

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”数组,而不是std数组),或通知其他人使用定义的术语。

我也不希望每次都不要计算它。

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

如何有效地找到my_array的总大小?我正在使用

5 个答案:

答案 0 :(得分:3)

编写一个在编译时进行计算的实用程序并不难。

import { withRouter } from 'react-router'

class Lista2 extends Component {
  ....
  onClick: (e, handleOriginal) => {
    this.props.history.push('some-page')
    console.log('A Td Element was clicked!')
    console.log('it produced this event:', e)
    console.log('It was in this column:', column)
    console.log('It was in this row:', rowInfo)
    console.log('It was in this table instance:', instance)
  }
}

export default withRouter(Lista2)

以上内容应阐明任何实际深度的嵌套数组定义,并求值到用于存储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

您可能会看到live

答案 1 :(得分:2)

如何

List.scrollToIndex(lastIndex)

答案 2 :(得分:2)

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

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;
}

答案 3 :(得分:1)

您可以使用绑定到尺寸的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;

答案 4 :(得分:1)

类似于 @KorelK 的方法。递归模板功能将在以下情况下停止 std::array is primitive type的类模板。

See online

#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{});
}