【问题标题】:Initializing Array of Arrays - Trouble初始化数组数组 - 麻烦
【发布时间】:2012-12-03 03:20:41
【问题描述】:

好的,我知道在 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


    【解决方案1】:

    如果您使用 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&lt;64, U64&gt; 会正常工作。

    该数组确实对 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】:

    我知道为什么这很有用,但是,在 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
    

    【讨论】:

    • 这听起来很有趣。让我看看如何将它融入我的通用代码方案中。 ;-)
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-31
      相关资源
      最近更新 更多