如何使用1d数组列表初始化2d数组?

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)

您可以在此实例中看到它

  • @MaxLanghof你也可以使用`std :: array test = {std :: array {1,2,3},std :: array {3,4,5}}` (2认同)

Nel*_*eal 5

使用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)

演示


Aco*_*gua 5

你提出的方式 - 根本不是......你可以:

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)

通过这种方式,你仍然可以如适用sizeofab...

或者反过来说:创建一个指针数组

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)