初始化数组数组 - 麻烦

问题描述 投票:0回答:3

好的,我知道在 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 的东西? - 欢迎)

c++ c arrays multidimensional-array clang
3个回答
6
投票

如果您使用 C++11,

array
的初始值设定项列表是灵活的:

std::array<std::array<U64, 64>, 12> multiDimArray = {
     A, B, C, D, E, F,  
     G, H, I, J, K, L
};

可以正常工作,假设

A..L
std::array<64, U64>

与 c 风格数组相比,该数组确实“没有开销”。 点击此处获取官方参考。

“对于一定数量的元素,数组的大小和效率是 相当于相应 C 风格数组的大小和效率 T[N]。”(来自参考文献)

我说“灵活”,因为你可以使用像这样的混合初始化列表:

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

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

我可以理解为什么这很有用,但是,在 C 中,仅使用数组的变量名将返回数组在内存中的地址。编译器不知道编译时 A 中实际存储的内容,因此这是行不通的。

5
投票
作为替代方案,您可以做的是使用 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

您可以利用二维数组实际上是一维指针数组这一事实来发挥您的优势。以下初始化应该适合您。

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


© www.soinside.com 2019 - 2024. All rights reserved.