Mon*_*mer 7 c++ arrays multidimensional-array
如何使用1d数组列表初始化2d数组?
void main()
{
int a[] = { 1,2,3 };
int b[] = { 4,5,6 };
int array[][3] = { a,b };
}
Run Code Online (Sandbox Code Playgroud)
Nat*_*ica 14
C++中的原始数组是一类二等公民.它们无法分配,无法复制,这意味着您可以使用它们来初始化其他数组,并且在大多数情况下它们的名称会衰减为指针.
Lucky C++ 11提供了一个解决方案. std::array就像一个原始数组,但它没有缺点.您可以使用它们来构建像2d这样的数组
std::array<int, 3> foo = {1,2,3};
std::array<int, 3> bar = {3,4,5};
std::array<std::array<int, 3>, 2> baz = {foo, bar};
Run Code Online (Sandbox Code Playgroud)
如果你有C++ 17支持,你可以利用类模板参数推导来摆脱必须指定模板参数,代码简化为
std::array foo = {1,2,3};
std::array bar = {3,4,5};
std::array baz = {foo, bar};
Run Code Online (Sandbox Code Playgroud)
您可以在此实例中看到它
使用std::array.
auto a = std::array{ 1,2,3 };
auto b = std::array{ 4,5,6 };
auto array = std::array{ a,b };
Run Code Online (Sandbox Code Playgroud)
你提出的方式 - 根本不是......你可以:
int array[][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
Run Code Online (Sandbox Code Playgroud)
如果你仍然需要a和b,你可以将它们作为指针:
int* a = array[0];
int* b = array[1];
Run Code Online (Sandbox Code Playgroud)
或者更接近原始尝试:引用数组:
int(&a)[3] = array[0];
int(&b)[3] = array[1];
Run Code Online (Sandbox Code Playgroud)
通过这种方式,你仍然可以如适用sizeof于a和b...
或者反过来说:创建一个指针数组
int a[] = { 1,2,3 };
int b[] = { 4,5,6 };
int* array[] = { a, b };
Run Code Online (Sandbox Code Playgroud)
到目前为止提出的所有这些解决方案的共同点是a和array [0]都访问完全相同的数据.如果你真的想要有两个独立的副本,那么就没有办法将数据从一个复制到另一个,例如通过std::copy.
但是,如果从原始数组切换到std::array,则可以直接进行此类初始化(使用副本):
std::array<int, 3> a;
std::array<int, 3> b;
std::array<std::array<int, 3> 2> array = { a, b };
Run Code Online (Sandbox Code Playgroud)