1

什么情况下使用比较好:

vector<X*>* vector = new vector<X>();

代替:

vector<X>* vector = new vector<X>();

有什么优点/缺点?

4

6 回答 6

7

动态分配向量本身几乎没有充分的理由。除非您正在做一些非常不寻常的事情,否则不要这样做。

在所有对象都具有相同类型的常见情况下,您通常需要一个对象向量vector<X>.

你会想要一个指针向量,vector<X*>如果

  • X是一个多态基类;和
  • 您想X通过向量访问不同子类型的对象;和
  • 您不需要容器来为您管理对象生命周期。

如果您希望容器管理异构对象的生命周期,则存储智能指针,例如std::unique_ptr,或使用类似Boost 指针容器库的东西。

正如评论中提到的,如果对象不能或不应该移动,您也可以考虑使用指针向量:向量将随着它们的增长移动它们的元素,以保持一个连续的数组。在这种情况下,您还应该考虑使用类似dequeor的稳定容器list

于 2013-09-25T14:42:52.350 回答
1

它根本不一样,因为在第一种情况下您存储一个指针,而在第二种情况下您存储一个值。

当您已经有指针时,最好使用指针向量,例如在堆上分配的对象(使用new)。在这种情况下,您甚至可以使用 的向量std::unique_ptr

当您直接拥有对象的值时,最好使用值向量,否则您必须确保对象没有被破坏。

而且我不明白为什么要动态分配向量?但是,正如您对这两种情况所做的那样,这不是问题所在。

于 2013-09-25T14:39:54.477 回答
1

除非vector<X>你有充分的理由不这样做。

vector<X*>如果向量不拥有它所存储的对象,或者您通过某种您无法控制的机制获取指针,则应该使用它。如果对象的复制或移动成本很高,它也可以更有效,但首先对其进行基准测试 -vector<X>将具有更好的引用局部性。它有一个很大的缺点,即销毁向量不会删除包含的指针,使其容易出错且不安全。用于vector<unique_ptr<X>>解决最后一个问题。

于 2013-09-25T14:41:54.267 回答
0

您永远不会想要指向 a 的指针vector,只需使用 avector并让它处理内存管理。而且您永远不会想要原始vector指针,而是使用某种智能指针,例如.std::shared_ptr

于 2013-09-25T14:39:32.793 回答
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());

在这里,您看到向量中的单个项目被跟踪了两次。如果您出于某种原因想要这个(这并不像听起来那么疯狂),请使用间接。

于 2013-09-25T14:42:36.600 回答
0

如果要将向量与动态创建的自定义分配器一起使用,则动态创建向量是唯一的选择。

关于 X* Mike Seymour 给出了一个很好的答案。

于 2013-09-25T14:52:26.707 回答