分配一个数组数组

时间:2013-06-08 23:39:03

标签: c++ c++11

假设我有以下数组:

GLfloat vertex[(vertexnm+2)][3];

无法对外部数组的元素进行简单分配:

vertex[0] = {0.0f, 0.0f, 0.0f};

结果为Array type 'GLfloat [3]' is not assignable

似乎可以采用以下方式:

*(vertex[0]) = *new GLfloat[3] {0.0f, 0.0f, 0.0f};

但它似乎不是一个好的解决方案。有干净的方法吗?

3 个答案:

答案 0 :(得分:2)

不幸的是,数组只不过是C中的荣耀指针 例如这意味着他们不会像你期望的那样复制(例如像对象)。

C ++ 11为数组引入了一个新的抽象,使数组表现得更好 更像你期望的,例如它们可以被复制或分配。使用pre-C ++ 11编译器/标准库,您可以使用array中TR1的tr1/array类。

#include <array>

int main() {
  typedef std::array<GLfloat, 3> vertex;
  std::array<vertex, vertexnm + 2> a;
  a[0] = vertex{0, 0, 0};
}

答案 1 :(得分:2)

尽管C风格的数组肯定不仅仅是“美化指针”,但无论你如何分割它,裸C风格的数组都不可分配。 C ++ 11在这方面没有任何改变。

你的

*(vertex[0]) = *new GLfloat[3] {0.0f, 0.0f, 0.0f};

不符合您的想法。在左侧vertex[0]衰减到指向vertex[0][0]的指针,您可以使用*取消引用。因此,左手大小只是vertex[0][0]

同时,new GLfloat[3] {0.0f, 0.0f, 0.0f}返回指向新分配的无名数组的[0]元素的指针。 *取消引用该指针,使您可以访问该[0]元素。

以上意味着您的作业与

完全相同
vertex[0][0] = nameless_dynamic_array[0];

即。它确实

vertex[0][0] = 0.0f;

新的ed数组成为内存泄漏。

为了将数组作为一个整体分配,你必须将它包装成一个类(std::array作为标准包装器)。或者,如果由于某种原因必须使用裸C风格的数组,请使用std::copy甚至memcpy将数据从一个数组复制到另一个数组。

答案 2 :(得分:0)

这是另一种选择:

 static const int myFirstArray[] = {16,2,77};
 static const int mySecondArray[] = {84,64,1};

 std::vector< std::vector<int> > myArray(3);
 myArray[0] = std::vector<int>(myFirstArray, myFirstArray + sizeof(myFirstArray) / sizeof(myFirstArray[0]) );
 myArray[1] = std::vector<int>(mySecondArray, mySecondArray + sizeof(mySecondArray) / sizeof(mySecondArray[0]) );
 //prints:
 //16 2 77
 //84 64 1
 for (unsigned int i=0;i<myArray.size();++i){
    for (unsigned int j=0;j<myArray[i].size();++j){
        std::cout << myArray[i][j] << " ";
    }
    std::cout << std::endl;
 }