推向量的向量
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 默认提供的方法更适合的方法。
【讨论】:
以上是关于推向量的向量的主要内容,如果未能解决你的问题,请参考以下文章