将值从向量分配给动态数组(C++)

Posted

技术标签:

【中文标题】将值从向量分配给动态数组(C++)【英文标题】:Assign values from vector to dynamic array (C++) 【发布时间】:2016-09-01 02:24:43 【问题描述】:

我有一个名为lineVertices 的线的顶点向量,我将传递这个数据来绘制一个OpenGL 形状,所以这个向量必须是数组的形式,我假设。我试过以下代码:

float* lineArray = new float[lineVertices.size()]();

for (unsigned i = 0; i < lineVertices.size(); i++) 
    lineArray[i] = lineVertices.at(i);

但是,向量的每个元素似乎只分配给数组的第一个元素。即使lineArray 标识符是指向第一个元素的指针,还有其他方法可以访问动态数组的不同元素吗?

如果有帮助,当我调试时,它说lineArray 的大小始终为1,尽管lineVertices' 的大小明显大于1。

我也试过下面的代码,但这也行不通。

float* lineArray = &lineVertices[0];

感谢任何帮助!

【问题讨论】:

这里有一些帮助:阅读帮助中心文章,了解如何组装minimal reproducible example,然后相应地编辑您的问题。 您将向量/数组传递给什么特定的 OpenGL 函数?你现在怎么称呼它? 所以这个向量必须是数组的形式 -- 嗯??只需调用 vector::data() 函数,您就知道 vector 具有您正在寻找的 array 吗? @PaulMcKenzie 显然不是,这就是他们问这个问题的原因......你为什么不回答解释误解而不是不那么巧妙地侮辱 OP?我在 SO 上看到太多你类型的 cmets。 Be nice. 代码使用new[] 使用向量中的条目数清楚地创建浮点数组,然后设置循环中的每个条目(您可以使用std::copy BTW)。因此,我认为这段代码没有任何问题(除了由于向量具有vector::data() 函数来获取数组而无需执行任何操作)。我认为您误解了调试器向您显示的内容。 【参考方案1】:

您可以将std::vector 直接传递给带有指向数组的指针的OpenGL 函数。只需使用::data() 成员函数。示例:

std::vector<float> vec = ...;
glVertex2fv(vec.data()); // only uses the first two elements

像这样的OpenGL函数需要一个指向一个或多个元素的指针。这不一定是使用new 创建的原始数组;它只是一个指向连续元素列表的指针。使用vector.data() 获取指向std::vector 内容(第一个元素)的指针。

如果你真的想用手动内存管理创建一个新数组,你可以这样做(效果和你贴的代码一样):

float* arr = new float[vec.size()]; // NO () - not a constructor, but operator new[]
for (size_t i = 0; i < vec.size(); i++) 
    arr[i] = vec[i];

【讨论】:

我正在尝试使用 glVertex2fv(),我相信它只需要一个指向数组的指针。我将如何做到这一点? @qxz -- // NO () - not a constructor, but operator new[] -- 在new[]的用法中加上括号是完全有效的。它所做的只是对元素进行零初始化。 new[] 的部分答案实际上与 OP 在最终结果方面的尝试没有什么不同。唯一的区别是 OP 尝试使用 () 初始化数据并在循环中调用 at()

以上是关于将值从向量分配给动态数组(C++)的主要内容,如果未能解决你的问题,请参考以下文章

动态分配 SIMD 向量数组是不是安全?

C++简单实现vector

使用循环将值从 C++ 中的一维数组添加到二维数组中

C ++中动态分配的向量中的分段错误

c++ 动态分配二维数组 new 二维数组

在 Visual Studio 2019 C++ 中,如何扩展动态分配的数组以显示其所有元素?