在何种情况下最好使用:
vector<X*>* vector = new vector<X>();而不是:
vector<X>* vector = new vector<X>();有哪些优点/缺点?
发布于 2013-09-25 14:42:52
几乎从来没有一个好的理由来动态分配向量本身。除非你做了非常不寻常的事情,否则不要那样做。
在所有对象都具有相同类型的常见情况下,通常需要一个对象向量vector<X>。
如果您想要一个指针向量,vector<X*>
X是一个多态基类;X的不同子类型的对象;如果希望容器管理异构对象的生存期,则存储智能指针(如std::unique_ptr )或使用类似于Boost指针容器库的东西。
正如注释中提到的,如果对象不能或不应该移动,您还可以考虑指针向量:向量将在元素增长时移动它们的元素,以维护连续数组。在这种情况下,您还应该考虑使用像deque或list这样的稳定容器。
发布于 2013-09-25 14:39:54
这是完全不同的,在第一种情况下,您存储一个指针,在第二种情况下,您存储一个值。
当您已经拥有指针时,最好使用指针向量,例如,对于堆上分配的对象(使用new)。在这种情况下,您甚至可以使用std::unique_ptr的向量。
当直接拥有对象的值时,最好使用值向量,否则就必须确保对象不被破坏。
我不明白你为什么要动态分配向量?但正如你对这两种情况所做的那样,这不是问题所在。
发布于 2013-09-25 14:41:54
喜欢vector<X>,除非你有充分的理由不这么做。
如果向量不拥有它正在存储的对象,或者通过无法控制的机制获得指针,则应该使用vector<X*>。如果对象的复制或移动成本很高,但首先对其进行基准测试-- vector<X>将具有更好的引用局部性,那么它也会更高效。它有一个很大的缺点,就是销毁向量不会删除包含的指针,这使得它容易出错,而且不例外。使用vector<unique_ptr<X>>修复最后一个问题。
https://stackoverflow.com/questions/19007802
复制相似问题