正确分配 std::vector

Posted

技术标签:

【中文标题】正确分配 std::vector【英文标题】:Correct allocation for std::vector 【发布时间】:2019-03-21 22:43:55 【问题描述】:

我在将我的 std::vector 提供给另一个班级时遇到问题。我将数据放入 std::vector 并将其放入名为“Mesh”的类中。而“Mesh”变成了“Model”。

// Store the vertices
std::vector<float> positionVertices;

positionVertices.push_back(-0.5f);
positionVertices.push_back(-0.5f);
positionVertices.push_back( 0.5f);
positionVertices.push_back(-0.5f);
positionVertices.push_back(-0.5f);
positionVertices.push_back( 0.5f);

// Put them into a mesh and the mesh into a model
Mesh mesh = Mesh(positionVertices);
Model model = Model(mesh);

在模型类中,我取回网格的位置顶点并将其转换为浮点[]。但看起来,我分配 std::vector 的方式是错误的,因为在检查模型类中的 std::vector 时,它的大小为 0。

// Store the vertices
float* dataPtr = &data[0];
glBufferData(GL_ARRAY_BUFFER, data.size() * sizeof(float), dataPtr, GL_STATIC_DRAW);

我怎样才能将数据正确地带入其他类?

我也不确定网格类的构造函数的工作方式。 Mesh.h:

// Mesh.h
class Mesh

public:
    std::vector<float> positionVertices;

    Mesh(std::vector<float>);
    ~Mesh();
;

Mesh.cpp:

// Mesh.cpp
Mesh::Mesh(std::vector<float> positionVertices) : positionVertices(Mesh::positionVertices)


模型.h:

// Model.h
class Model
  
public:
Mesh mesh;
unsigned int vertexArray;
unsigned int vertexCount;

Model(Mesh);
~Model();

void storeData(std::vector<float> data, const unsigned int index, const unsigned int size);
;

模型.cpp:

// Model.cpp
Model::Model(Mesh mesh) : mesh(Model::mesh)
 ... 

【问题讨论】:

题外话:std::vector&lt;float&gt; positionVertices-0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f; 我在提供的代码中没有看到任何错误,它可能在其他地方。 minimal reproducible example 请。 显示的代码没有明显的问题,所以问题一定出在没有显示的代码上。 你能展示MeshModel 类的构造函数吗? @maniel34 @Chase 是的,我现在把它们放到问题中。现在,我也认为这一定是原因。 【参考方案1】:
// Mesh.cpp
Mesh::Mesh(std::vector<float> positionVertices) :
positionVertices(Mesh::positionVertices) // Here's the problem


初始化列表中的positionVerticesMesh::positionVertices,所以你将它分配给它自己。

使用

positionVertices(positionVertices)

另外,改变

Mesh::Mesh(std::vector<float> positionVertices) :

Mesh::Mesh(const std::vector<float>& positionVertices) :

因此您不会制作不必要的矢量副本。

【讨论】:

我不同意最后的更改:引用 vector 将无济于事,因为 vector 仍将被复制到 Mesh::positionVertices。可以移动它,但否则我会将其保留为副本,以便界面阅读效果更好(Mesh 的界面说“我复制这个”而不是“我可能存储对此的引用,因此请确保它保持活动状态我的整个一生”,这很重要) @Tas 如果它不是由 const ref 传递的,它将从原始变量复制到构造函数调用中,然后再复制到成员变量中。我会把你的注意力引向***.com/questions/2139224/… 我非常怀疑任何有价值的编译器都不会遗漏其中一个副本,就我个人而言,我宁愿我的界面清楚地被复制,而不是用户不必担心存储参考。假设 OP 没有使用 10000 大的向量创建 10000 Mesh,即使有副本也很可能毫无意义。无论如何,这些只是我的意见,我没有投反对票,您的回答仍然正确。 很明显,因为你不能存储const&amp;(没有你不应该做的指针恶作剧),你只能从中读取和复制。这就是为什么我认为您的观点被误导的原因,这是我链接到的文章的要点,也是我链接那篇文章的原因。 当然可以存储const std::vector&lt;float&gt;&amp;,为什么不能呢?您有对原始 vector 的引用,当它发生更改时,您会收到这些更改,但您无法更改它。因此,如果创建一个局部向量,然后将其提供给一个比 vector 寿命更长的 Mesh 实例,就会出现问题。当然,在任何给定的小例子中,一切都会好起来的,但我在传递引用方面遇到了专业问题。对于任何给定的函数,它们都是首选,但在构造函数中是一个坏主意,因为该类可能存储引用。

以上是关于正确分配 std::vector的主要内容,如果未能解决你的问题,请参考以下文章

如何正确分配和解除分配向量图

std::vector- 他将分配多少内存(在重新分配期间)

C++ 动态分配的 std::vector

将 std::vector 分配给 std::valarray

C++ STD 容器:std::vector - 有没有办法清除向量并保留存储分配?

std::vector::reserve 是不是重新分配内部数组?