假设我有以下数组:
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};
但它似乎不是一个好的解决方案。有干净的方法吗?
答案 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;
}