在什么情况下使用会更好:
vector<X*>* vector = new vector<X>();
而不是:
vector<X>* vector = new vector<X>();
有什么优点/缺点?
答案 0 :(得分:7)
动态分配矢量本身几乎没有充分的理由。除非你做一些非常不寻常的事情,否则不要这样做。
在所有对象具有相同类型的常见情况下,您通常需要一个对象矢量vector<X>
。
你需要一个指针向量,vector<X*>
if
X
是一个多态基类;和X
的不同子类型的对象;和如果您希望容器管理异构对象的生命周期,则存储智能指针,例如std::unique_ptr
,或使用类似Boost pointer container库的内容。
正如评论中所提到的,如果对象不能或不应该被移动,你也可以考虑一个指针向量:向量将随着它们的增长移动它们的元素,以维持一个连续的数组。在这种情况下,您还应考虑使用稳定的容器,例如deque
或list
。
答案 1 :(得分:1)
与第一种存储指针的情况完全不同,在第二种情况下存储一个值。
当你已经拥有指针时,最好使用指针向量,例如对于在堆上分配的对象(使用new
)。
在这种情况下,您甚至可以使用std::unique_ptr
。
当你直接拥有对象的值时,最好使用值向量,或者你必须确保对象不被破坏。
我不知道你为什么要动态分配矢量?但正如你在两个案例中所做的那样,那不是问题。
答案 2 :(得分:1)
首选vector<X>
,除非你有充分理由不这样做。
vector<X*>
。如果复制或移动对象的成本很高,也可以更高效,但首先对其进行基准测试 - vector<X>
将具有更好的参考局部性。它有一个很大的缺点,即破坏向量将不删除包含的指针,使其容易出错并且不是异常安全的。使用vector<unique_ptr<X>>
来解决最后一个问题。
答案 3 :(得分:0)
你永远不会想要一个指向vector
的指针,只需直接使用vector
并让它处理内存管理。并且您永远不会想要vector
原始指针,而是使用某种智能指针,例如std::shared_ptr
。
答案 4 :(得分:0)
在现代C ++中,原始指针有点不流行。特别是,当一个人可以没有间接地在一起做。对于不需要的情况,可以使用智能指针。首先,我不会new
向量本身(我认为我没有new
直接编辑任何std
类型。
您可能想要共享一个向量,然后可能存在一种情况,其中有一个间接到向量的原因,但它看起来像这样:
auto myVec = std::make_shared<std::vector<X>>();
// ^ -- that's an std::shared_ptr<std::vector<X>>
但我想,那不是你的问题。你是在矢量的内容之后。可能有充分的理由对元素进行间接,例如在一些聪明的算法中。但我还建议使用智能指针:
auto myVec = std::make_shared<std::vector<std::shared_ptr<X>>>();
myVec.push_back(std::make_shared<X>(xarg1,xarg2));
myVec.push_back(myVec.back());
在这里,您可以看到向量中的单个项目被跟踪两次。如果你出于某种原因想要这个(这并不像听起来那么疯狂),请使用间接。
答案 5 :(得分:0)
如果要将向量与动态创建的自定义分配器一起使用,则动态创建向量是唯一的选择。
关于X * Mike Seymour给出了一个很好的答案。