好的,我知道在C ++中 - 让我们说2维 - 数组可以这样初始化:
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的东西? - 是受欢迎的)
答案 0 :(得分:4)
我可以看到为什么这很有用,但是,在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
答案 1 :(得分:4)
如果使用C ++ 11,array
的初始化列表很灵活:
std::array< array<U64, 64>, 12> multiDimArray = {
A, B, C, D, E, F,
G, H, I, J, K, L
};
假设A..L
为std::array<64, U64>
,将正常工作。
数组确实对c样式数组有无开销。 Click here for official reference.
“一些元素的数组的大小和效率是 相当于相应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;
答案 2 :(得分:1)
你可以使用这样一个事实:二维数组实际上是一个指向你的优势的一维指针数组。以下初始化应该适合您。
const U64 *multiDimArray[12] = {
A, B, C, D, E, F,
G, H, I, J, K, L
};