C ++将向量推回向量

问题描述 投票:2回答:3

这是我创建的向量;

std::vector<std::vector<Vertex*>*> Vertices;

而且我在弄清楚如何将std::vector<Vertex*>推回外部时遇到麻烦向量。

所以我想做的是:

Vertices.push_back(new vector().push_back(new Vertex()));

但是我不确定正确的方法是什么。希望你们的想法。

c++ vector push back
3个回答
5
投票

尽管有时可以创建一个指针向量(最好是智能指针),但将指针向量作为向量绝不是一个好主意:这毫无理由使您的内存管理复杂化。

最佳解决方案是使用顶点对象的矢量,如下所示:

std::vector<std::vector<Vertex> > vertices;

这将使您像这样回退:

vector<Vertex> vv;
vv.push_back(Vertex(...));
vertices.push_back(vv);

如果要具有多态性的Vertex的后代向量,请使用指针向量的向量:

std::vector<std::vector<Vertex*> > vertices;
...
vector<Vertex*> vv;
vv.push_back(new Vertex(...));
vertices.push_back(vv);

请注意,如果要执行此操作,您将可以释放矢量内的Vertex对象。更好的解决方案是使用智能指针-例如unique_ptr,如下所示:

std::vector<std::vector<unique_ptr<Vertex> > > vertices;

[unique_ptr将负责自动释放Vertex对象。


1
投票

您不能单行执行。但是您可以在4中完成;

std::vector<std::vector<Vertex*>*> Vertices;
std::vector<Vertex*> * vec = new std::vector<Vertex*>;
vec.push_back(new Vertex()); // fill the inner vector as many times as you need
Vertices.push_back(vec);

但是为什么要这么做呢?如果您不为外部向量的每个元素调用delete,则将泄漏内存,但是在执行此操作之前,您需要在内部向量的每个delete上调用Vertex*

编辑:有关存储顶点而不泄漏内存的更好方法,请查看dasblinkenlight的答案。


0
投票

这是可行的。例如,尝试:

std::vector<std::vector<Vertex*>> Vertices;
Vertices.push_pack(std::vector<Vertex*>());
Vertices.back().push_back(new Vertex[8]);

遵循此代码,您不需要使用任何额外的内存。要访问或修改位于第一个向量的第i个成员,第二个向量的第j个成员以及数组的第6个成员中的元素,可以使用:

Vertices.at(i).at(j)[6];
© www.soinside.com 2019 - 2024. All rights reserved.