推动矢量矢量

时间:2009-03-24 00:35:04

标签: c++ stl vector

推回矢量矢量有什么问题吗?像

typedef vector<Point> Polygon;
vector<Polygon> polys;
polys.push_back(some_poly);

some_poly中的所有元素都将复制对吗?

我的代码中有一个错误,我似乎无法弄清楚它有什么问题。

4 个答案:

答案 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默认提供的方法更适合的方法。