首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vector<X*>*对vector<X>*

vector<X*>*对vector<X>*
EN

Stack Overflow用户
提问于 2013-09-25 14:32:51
回答 6查看 120关注 0票数 1

在何种情况下最好使用:

代码语言:javascript
复制
vector<X*>* vector = new vector<X>();

而不是:

代码语言:javascript
复制
vector<X>* vector = new vector<X>();

有哪些优点/缺点?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-09-25 14:42:52

几乎从来没有一个好的理由来动态分配向量本身。除非你做了非常不寻常的事情,否则不要那样做。

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

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

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

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

正如注释中提到的,如果对象不能或不应该移动,您还可以考虑指针向量:向量将在元素增长时移动它们的元素,以维护连续数组。在这种情况下,您还应该考虑使用像dequelist这样的稳定容器。

票数 7
EN

Stack Overflow用户

发布于 2013-09-25 14:39:54

这是完全不同的,在第一种情况下,您存储一个指针,在第二种情况下,您存储一个值。

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-09-25 14:41:54

喜欢vector<X>,除非你有充分的理由不这么做。

如果向量不拥有它正在存储的对象,或者通过无法控制的机制获得指针,则应该使用vector<X*>。如果对象的复制或移动成本很高,但首先对其进行基准测试-- vector<X>将具有更好的引用局部性,那么它也会更高效。它有一个很大的缺点,就是销毁向量不会删除包含的指针,这使得它容易出错,而且不例外。使用vector<unique_ptr<X>>修复最后一个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19007802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档