推回矢量矢量有什么问题吗?像
typedef vector<Point> Polygon;
vector<Polygon> polys;
polys.push_back(some_poly);
some_poly中的所有元素都将复制对吗?
我的代码中有一个错误,我似乎无法弄清楚它有什么问题。
答案 0 :(得分:6)
对,矢量按预期复制。有一个名为geordi的好软件可以显示:
{
using namespace tracked;
typedef vector<B> poly_t;
poly_t poly(3); // contains 3 B's
vector<poly_t> v;
v.push_back(poly);
}
它跟踪tracked::B
的创建/副本。这是输出:
B0* B1*(B0) B2*(B0) B3*(B0) B0~ B4*(B1) B5*(B2) B6*(B3) B4~ B5~ B6~ B1~ B2~ B3~
当我们仅跟踪v.push_back
:
B4*(B1) B5*(B2) B6*(B3)
如您所见,首先将B0创建为向量构造函数的默认参数。然后将该对象复制到3个B中,然后在构造函数返回时再次销毁B0。 poly然后被创建。然后,我们将它推回到多边形向量中。参数poly被复制到一个新的向量中,该向量在多边形向量中创建并由其管理。
如果崩溃,问题可能在于程序的另一部分。检查复制构造函数/构造函数和析构函数是否正常工作,如果使用动态内存分配,则不会删除两次。
答案 1 :(得分:2)
没有任何错误。它不是最有效的插入/擦除结构,但它确实有效。
如果您有兴趣使插入/删除更有效,您应该切换到:
typedef vector<Point> Polygon;
typedef vector<Polygon*> Polygons;
Polygons polys;
polys.push_back(new Polygon());
答案 2 :(得分:2)
是的,只要您为Point类定义了一个复制构造函数和赋值运算符(并确保它们正在做正确的事情等),这应该可以正常工作。 std :: vector会推得很好,所以bug必须在别处 - 显然我们需要更多的细节来帮助你。
如果你要推送一些东西,但是在它工作之前不要担心它会产生性能影响(然后只有当它成为一个问题时)。
答案 3 :(得分:1)
尽管矢量矢量没有任何问题,但您可能需要查看Boost.MultiArray。它可以更有效率。
typedef boost::multi_array<Point, 2> Polygons;
另一个想法是你可能想让Polygon成为一个真正的类(可能包含一个向量),以提供比std :: vector默认提供的方法更适合的方法。