推向量的向量

Posted

技术标签:

【中文标题】推向量的向量【英文标题】:Pushing vector of vectors 【发布时间】:2009-03-24 00:35:04 【问题描述】:

推回向量向量有什么问题吗?喜欢

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

some_poly 中的所有元素都会被复制对吧?

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

【问题讨论】:

【参考方案1】:

是的,向量按预期复制。有一个很好的软件叫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 然后被创建。然后,我们将它 push_back 成一个多边形向量。参数 poly 被复制到一个新向量中,该向量在多边形向量中创建并由该向量管理。

如果它崩溃,则问题可能出在程序的另一部分。检查复制构造函数/构造函数和析构函数是否正常工作,如果您使用动态内存分配,它们是否不会删除两次。

【讨论】:

感谢您的详尽回复!那么它一定是一个逻辑错误。错误的元素被复制了,但这是另一个问题。【参考方案2】:

是的,只要您为 Point 类定义了复制构造函数和赋值运算符(并确保它们做正确的事情等),那应该可以正常工作。 std::vector 会很好地推送,所以错误必须在其他地方 - 显然我们需要更多细节来进一步帮助。

如果您要推送事物的向量,则会对性能产生影响,但在它工作之前不要担心(只有当它成为问题时)。

【讨论】:

多边形“类”(实际上是 typedef)已经有一个很好的复制构造函数。您可能是指 Point 类。【参考方案3】:

没有任何问题。这不是插入/擦除最有效的结构,但它绝对可以工作。

如果您有兴趣提高插入/删除的效率,您可能应该改用:

typedef vector<Point> Polygon;
typedef vector<Polygon*> Polygons;
Polygons polys;
polys.push_back(new Polygon());

【讨论】:

但是你不得不担心资源管理。完成后,您必须以某种方式删除这些指针。 我敢说“多边形”类应该是所有者并且可以处理释放。只要您坚持明确的所有权规则,资源管理就不会那么糟糕。但你的观点是有效的。【参考方案4】:

虽然向量的向量没有什么问题,但您可能想看看Boost.MultiArray。效率会更高。

 typedef boost::multi_array<Point, 2> Polygons;

另一个想法是,您可能想让 Polygon 成为一个真正的类(可能包含一个向量),以提供比 std::vector 默认提供的方法更适合的方法。

【讨论】:

以上是关于推向量的向量的主要内容,如果未能解决你的问题,请参考以下文章

11三个重要统计量的分布

游戏开发3D基础知识

空间两向量之间的旋转角如何求?角度范围在0-360°

人工智能算法小白实战-你真的了解词向量吗?

余弦计算相似度理解以及计算

机器学习基础---支持向量机SVM