如何在c++11中为多维数组使用容器std::array<type, size>?
How to use the container std::array<type, size> for multidimensional array in c++11?
一维数组,例如包含三个整数的数组,可以定义为 std::array<int, 3> myarray
或 myarray[3]
。对于像myarray[3][3]
这样的多维数组,是否有像std::array<type, size>
这样的容器?
This 应该有效:
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;
}
一个关键部分是确保 {}
初始化像 std::array
一样工作,并尽可能保持自己像 pod 一样合理。与 std::array
的兼容性也很重要,还有什么比 std::array
更兼容?所以我的解决方案从 std::array
s:
生成多维数组
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>;
};
示例语法:
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" );
如果维度为 0,则稍微优化可能涉及折叠整个数组层次结构,但我不确定。
A multi_array<int>
是一个 int
作为旁白(int
的零维数组),既因为它有意义,也因为它使代码更简单。
这是一个old version.
一维数组,例如包含三个整数的数组,可以定义为 std::array<int, 3> myarray
或 myarray[3]
。对于像myarray[3][3]
这样的多维数组,是否有像std::array<type, size>
这样的容器?
This 应该有效:
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;
}
一个关键部分是确保 {}
初始化像 std::array
一样工作,并尽可能保持自己像 pod 一样合理。与 std::array
的兼容性也很重要,还有什么比 std::array
更兼容?所以我的解决方案从 std::array
s:
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>;
};
示例语法:
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" );
如果维度为 0,则稍微优化可能涉及折叠整个数组层次结构,但我不确定。
A multi_array<int>
是一个 int
作为旁白(int
的零维数组),既因为它有意义,也因为它使代码更简单。
这是一个old version.