初始化数组的数组 - 遇到问题

10

好的,我知道在C++中,一个二维数组可以这样初始化:

int theArray[5][3] = { 
    {1,2,3},
    {4,5,6},
    {7,8,9},
    {10,11,12},
    {13,14,15} 
};

现在,如果我想使用预先存在的数组作为theArray的元素呢?

例如:

// A, B, C, D,... have already been declared as :
// `const U64 A[] = { 1,2,3,4 };` etc...

const U64 multiDimArray[12][64] = { 
     A, B, C, D, E, F,  
     G, H, I, J, K, L
};

这个代码会抛出一个错误:

这个代码会抛出一个错误

cannot initialize an array element of type 'const U64' 
(aka 'const unsigned long long') with an lvalue of type 'const U64 [64]'

我理解您的意思,但希望您也能理解我的。

有没有一种方法可以绕过去,让我轻松地实现同样的事情?(欢迎任何建议 - 也许使用Boost?)

3个回答

6
如果您使用C++11,array的初始化列表是灵活的:
std::array< array<U64, 64>, 12> multiDimArray = {
     A, B, C, D, E, F,  
     G, H, I, J, K, L
};

假设A..Lstd::array<64, U64>,它们将工作得很好。

该数组与C风格数组相比没有额外开销。请点击这里查看官方参考资料。

"对于某些元素数量的数组,其大小和效率等同于相应的C风格数组T[N]。"(来自参考资料)


我说“灵活”,因为您可以使用混合初始化程序列表,如下所示:

std::array<int, 3> first_row = {1,2,3};
std::array<array<int, 3>, 2> a={
  first_row,
  {2, 2, 2}
};

您可以将其用作固定大小数组,并使用相同的操作:
a[1][2]=2; a[0][1]=1; a[0][2]=3;

你可以使用新的数组类来创建固定大小的数组。 - Stephen Chu

5
我可以理解这个方法的用处,然而在C语言中,只使用数组变量名称会返回该数组在内存中的地址。编译器在编译时并不知道A实际上存储了什么内容,因此这种方法行不通。
作为替代方案,您可以使用memcpy将元素复制到数组中(但这样做将不是“const”),或者您可以使用“#define A {1, 2, 3, 4}”之类的代码段,然后进行一些操作。
#define A_val { 1, 2, 3, 4 }
#define B_val { 5, 6, 7, 8 }
const U64 multiDimArray[12][64] = {
    A_val,
    B_val,
    // and so on and so forth
}
const U64 A[4] = A_val; // if you need this
const U64 B[4] = B_val; // you can do it like this

这听起来是一个非常有趣的想法。让我看看如何将其融入我的通用代码方案中。;-) - Dr.Kameleon

2
你可以利用二维数组实际上是一个指针的一维数组这一事实来方便地进行操作。以下初始化方式应该适合你的需求。
const U64 *multiDimArray[12] = { 
     A, B, C, D, E, F,  
     G, H, I, J, K, L
};

实际上,它们并不是一维指针数组。你的是,但是你的并不是真正的二维数组。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接