9

OK、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 を使用したものですか? - 歓迎します)

4

3 に答える 3

6

C++11 を使用する場合、 an の初期化子リスト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 スタイルの配列へのオーバーヘッドはありません。公式リファレンスについては、ここをクリックしてください。

「いくつかの要素に対する配列のサイズと効率は、対応する 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;
于 2012-12-15T08:06:46.663 に答える
5

これが便利な理由はわかりますが、C では、配列の変数名だけを使用すると、メモリ内の配列のアドレスが返されます。コンパイラは、コンパイル時に A に実際に何が格納されているかを認識していないため、これは機能しません。

別の方法として、 memcpy を使用して要素を配列にコピーするか (ただし、そうではありませんconst)、または a#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
于 2012-12-15T07:51:50.370 に答える
2

ここでは、2 次元配列が実際にはポインターの 1 次元配列であるという事実を利用できます。次の初期化がうまくいくはずです。

const U64 *multiDimArray[12] = { 
     A, B, C, D, E, F,  
     G, H, I, J, K, L
};
于 2012-12-15T08:08:46.447 に答える