你可以使用矢量的大小作为数组的长度吗?

时间:2011-01-23 19:57:55

标签: c++ arrays vector

我有一个std :: vector定义为:

std::vector<glm::vec3> faces;

我想使用该向量的大小作为浮点数组的长度。现在我正试着这样做:

float vertices[faces.size()][3];

但是我不断收到错误,说你必须使用一个恒定值。我想也许是因为矢量的大小可以改变,所以我尝试了这个:

const int size = faces.size();
float vertices[size][3];

但我仍然得到同样的错误。有可能这样做吗?

4 个答案:

答案 0 :(得分:4)

为什么要使用C数组呢? vector在这里更容易接受。

vector<vector<float> > vertices(faces.size(), vector<float>(3));

如果您已经知道内部向量的大小并且其大小是固定的,那么可以肯定结构比这里的向量更适合:

struct vertex {
    float x;
    float y;
    float z;
};

vector<vertex> vertices(faces.size());

在C ++中,C风格向量的有用性受到严重的限制。唯一的用途基本上是在编译时你知道它们的大小(通常也是内容)并将它们用作一个美化的常量。对于其他一切,存在更好的容器。甚至这个利基也被std::array填入下一个标准。

答案 1 :(得分:2)

不在标准C ++中(尽管我相信某些编译器会将其作为非标准语言扩展提供)。

您可以执行以下操作:

float (*vertices)[3] = new int[faces.size()][3];

请注意,现在已经在堆上分配了这个,所以在某些时候你需要delete [] vertices

答案 2 :(得分:1)

您遇到的问题是您尝试使用非常量表达式在编译时创建数组的大小。 vector :: size是一个运行时操作。在第二个例子中,虽然您可能认为自己很聪明,但编译器很可能会优化该变量并推断您实际上是使用了一些仅在运行时才知道的数量。

除非您必须与C库或遗留物集成(我看到您正在使用C语言的OpenGL调用),否则我建议您查看Boost::multi_array。因此,

boost::multi_array<float,2> myFloats(boost::extents[myVector.size()][3]);

答案 3 :(得分:0)

您无法使用非常量数组大小在堆栈上定义对象数组(也称为自动变量)。必须在编译时知道数组的大小。编译器还能知道为阵列保留多少堆栈空间吗?

如果你想要一个直到运行时才确定大小的数组,你必须使用new运算符来定义堆上的数组。