【问题标题】:How to set initial size of std::vector?如何设置 std::vector 的初始大小?
【发布时间】:2012-07-12 13:00:20
【问题描述】:

我有一个vector<CustomClass*>,我在向量中放了很多项目,我需要快速访问,所以我不使用列表。如何设置向量的初始大小(例如设置为 20 000 个位置,以免插入新的时复制)?

【问题讨论】:

  • 在任何 std::vector 参考中都有一个构造函数和两个函数,具体取决于哪个更适合您的需求。
  • 设置初始值是无法避免复制的。
  • 避免复制?就复制成本而言,存储指针是相当轻量级的。

标签: c++ stl


【解决方案1】:
std::vector<CustomClass *> whatever(20000);

或:

std::vector<CustomClass *> whatever;
whatever.reserve(20000);

前者设置数组的实际大小——即,使其成为一个包含 20000 个指针的向量。后者将向量留空,但为 20000 个指针保留空间,因此您可以插入(最多)那么多指针,而无需重新分配。

至少根据我的经验,其中任何一个都会在性能上产生巨大差异是相当不寻常的——但在某些情况下,两者都会影响正确性。特别是,只要不发生重新分配,向量中的迭代器就保证保持有效,并且一旦您设置了大小/保留空间,您就可以保证只要您不进行任何重新分配' t 增加超出此大小的大小。

【讨论】:

  • 对于大量插入/删除,哪一个更有效?
  • @Loggie:我怀疑效率会有什么不同。大多数情况下,它会改变您使用它的方式——对于前者,您只需处理指针,例如whatever[10000] = somepointer;,后者要求您添加每个指针push_back。至少如果你习惯了vector,后者可能更简单、更自然。
  • 如果被复制的容器的大小是已知的,为什么(重新)调整大小然后复制而不是 push_back 不是更有效?
  • @Cincinnatus:因为它调用了reserve,它预先分配了内存大小。从理论上讲,设置大小仍然可以更快,因为它还避免了每次添加项目时都增加当前大小。但实际上,我怀疑你可以衡量这一点。
  • 其实,如果你在热路径上这样做,并且代码被调用很多,你可以做很多指令和节省时间。
【解决方案2】:

您需要使用reserve函数来设置初始分配的大小或在初始构造函数中进行。

vector<CustomClass *> content(20000);

vector<CustomClass *> content;
...
content.reserve(20000);

当您reserve() 元素时,vector 将为(至少?)这么多元素分配足够的空间。 vector 中不存在元素,但内存已准备好使用。这可能会加速push_back(),因为内存已经分配。

【讨论】:

  • 在构造过程中也可以通过传入一个完整的参数来分配大小(例如std::vector&lt;Custom Class*&gt; content(100);
  • @kstruct:是的,但效率可能会降低 - 效率非常低。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 2021-12-30
  • 2016-07-30
  • 2010-09-19
  • 2010-09-20
相关资源
最近更新 更多