C++ 分配一个数组

C++ 分配一个数组,c++,c++11,C++,C++11,假设我有以下数组: GLfloat vertex[(vertexnm+2)][3]; 无法对外部数组的元素进行简单赋值: vertex[0] = {0.0f, 0.0f, 0.0f}; *(vertex[0]) = *new GLfloat[3] {0.0f, 0.0f, 0.0f}; 导致数组类型“GLfloat[3]”不可赋值的 以下方法似乎是可行的: vertex[0] = {0.0f, 0.0f, 0.0f}; *(vertex[0]) = *new GLfloat[3] {0.

假设我有以下数组:

GLfloat vertex[(vertexnm+2)][3];
无法对外部数组的元素进行简单赋值:

vertex[0] = {0.0f, 0.0f, 0.0f};
*(vertex[0]) = *new GLfloat[3] {0.0f, 0.0f, 0.0f};
导致数组类型“GLfloat[3]”不可赋值的

以下方法似乎是可行的:

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

但这似乎不是一个好的解决方案。有没有一种干净的方法可以做到这一点?

不幸的是,数组只不过是C语言中华丽的指针而已 e、 这里的意思是他们不会像你期望的那样复制(例如像对象)

C++11为数组引入了一种新的抽象,它使数组的行为更加复杂 更像您期望的,例如,它们可以被复制或分配。使用C++11之前的编译器/标准库,您可以在
TR1/array
中使用TR1中的
array

#include <array>

int main() {
  typedef std::array<GLfloat, 3> vertex;
  std::array<vertex, vertexnm + 2> a;
  a[0] = vertex{0, 0, 0};
}
#包括
int main(){
typedef std::数组顶点;
std::数组a;
a[0]=顶点{0,0,0};
}

不幸的是,数组只不过是C语言中华丽的指针,它 e、 这里的意思是他们不会像你期望的那样复制(例如像对象)

C++11为数组引入了一种新的抽象,它使数组的行为更加复杂 更像您期望的,例如,它们可以被复制或分配。使用C++11之前的编译器/标准库,您可以在
TR1/array
中使用TR1中的
array

#include <array>

int main() {
  typedef std::array<GLfloat, 3> vertex;
  std::array<vertex, vertexnm + 2> a;
  a[0] = vertex{0, 0, 0};
}
#包括
int main(){
typedef std::数组顶点;
std::数组a;
a[0]=顶点{0,0,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;
 }
static const int myFirstArray[]={16,2,77};
静态常量int mySecondArray[]={84,64,1};
std::vectormyArray(3);
myArray[0]=std::vector(myFirstArray,myFirstArray+sizeof(myFirstArray)/sizeof(myFirstArray[0]);
myArray[1]=std::vector(mySecondArray,mySecondArray+sizeof(mySecondArray)/sizeof(mySecondArray[0]);
//印刷品:
//16 2 77
//84 64 1

对于(无符号整数i=0;i,这里是另一种选择:

 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;
 }
static const int myFirstArray[]={16,2,77};
静态常量int mySecondArray[]={84,64,1};
std::vectormyArray(3);
myArray[0]=std::vector(myFirstArray,myFirstArray+sizeof(myFirstArray)/sizeof(myFirstArray[0]);
myArray[1]=std::vector(mySecondArray,mySecondArray+sizeof(mySecondArray)/sizeof(mySecondArray[0]);
//印刷品:
//16 2 77
//84 64 1

对于(unsigned int i=0;i,即使C样式数组肯定不仅仅是“美化指针”,但裸C样式数组是不可赋值的,无论您如何分割它。C++11在这方面没有任何改变

你的

与您认为的不一样。在左侧
顶点[0]
衰减到指向
顶点[0][0]
的指针,您使用
*
解除对该指针的引用。因此,左侧的大小只是
顶点[0][0]

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

以上说明你的作业相当于

vertex[0][0] = nameless_dynamic_array[0];
i、 是的

vertex[0][0] = 0.0f;
随着新的ed阵列成为内存泄漏


为了将一个数组作为一个整体分配,您必须将其包装到一个类中(
std::array
是一个标准包装器)。或者,如果出于某种原因必须使用裸C样式数组,则使用
std::copy
甚至
memcpy
将数据从一个数组复制到另一个数组。

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

你的

与您认为的不一样。在左侧
顶点[0]
衰减到指向
顶点[0][0]
的指针,您使用
*
解除对该指针的引用。因此,左侧的大小只是
顶点[0][0]

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

以上说明你的作业相当于

vertex[0][0] = nameless_dynamic_array[0];
i、 是的

vertex[0][0] = 0.0f;
随着新的ed阵列成为内存泄漏


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

您可以使用
std::array
。您可以使用
std::array