如何在c ++ 11中使用容器std :: array <type,size>用于多维数组?

R.W*_*ner 6 c++ arrays multidimensional-array c++11

例如,包含三个整数的一维阵列可以定义为std::array<int, 3> myarraymyarray[3].是否有类似std::array<type, size>多维数组的容器myarray[3][3]

Yak*_*ont 5

一个关键的部分是确保{}初始化的工作原理std::array,并保持自己像pod一样合理.兼容性std::array也很重要,什么比一个更兼容std::array?所以我的解决方案从std::arrays 生成多维数组:

template<class T, size_t... sizes>
struct multi_array_helper {
  using type=T;
};
template<class T, size_t... sizes>
using multi_array = typename multi_array_helper<T, sizes...>::type;

template<class T, size_t s0, size_t... sizes>
struct multi_array_helper<T, s0, sizes...> {
  using type=std::array<multi_array<T, sizes...>, s0>;
};
Run Code Online (Sandbox Code Playgroud)

实例

示例语法:

multi_array<int, 2,2> arr = {{ {{0,1}}, {{2,3}} }};
static_assert( std::is_same< multi_array<int,2,2>, std::array<std::array<int,2>,2> >{}, "see, just arrays under the hood" );
Run Code Online (Sandbox Code Playgroud)

稍微优化可能涉及折叠整个数组层次结构,如果任何维度为0,但我不确定.

A multi_array<int>是一个int旁边(ints的零维数组),因为它有意义,并且因为它使代码更简单.


这是旧版本.


Axa*_*alo 3

应该有效:

template<typename T, std::size_t Size, std::size_t ...Sizes>
struct MultiArray : public std::array<MultiArray<T, Sizes...>, Size>
{
};

template<typename T, std::size_t Size>
struct MultiArray<T, Size> : public std::array<T, Size>
{
};

int main()
{
    MultiArray<int, 3, 6, 8> ma;

    std::cout << ma.size() << std::endl;
    std::cout << ma[0].size() << std::endl;
    std::cout << ma[0][0].size() << std::endl;

    ma[2][1][6] = 4;
}
Run Code Online (Sandbox Code Playgroud)

  • 缺点是“MultiArray”不再是聚合。 (3认同)