【问题标题】:Complexity of downsizing STL vector缩小 STL 向量的复杂性
【发布时间】:2021-03-27 13:18:20
【问题描述】:

缩小(减小大小)std::vector<int> 的时间复杂度是多少? 我知道它不会重新分配内存。在自定义类上,它可能需要 为所有被移除的元素调用析构函数。但是对于整数, 缩小规模会在恒定时间内发生吗?

【问题讨论】:

  • 基本类型没有析构函数,但vector 可能在内部使用placement-new 并且仍然可以在它们上调用析构函数,这是允许的。编译器可能足够聪明,可以意识到析构函数调用是无操作的并优化它们,或者vector 实现可能专门用于实现它并跳过它们,无论哪种方式都会导致调整大小有效地为 O(1),因为唯一的操作就是减少size() 的值。这实际上取决于`vector``的实现,我认为没有概述不同类型的时间复杂度。

标签: c++ vector stl time-complexity stdvector


【解决方案1】:

取决于您所说的“减小矢量的大小”是什么意思。

通常,人们通过调用erase 从向量中删除元素。如果你删除向量的 末尾 的东西,那么事情就很简单了,所发生的一切就是元素被破坏 - 正如 Remy 指出的那样,这对于 int 来说是无操作的秒。

如果您要从结尾以外的地方擦除,则必须将元素随机播放,这需要时间。幸运的是,对于您的用例,复制 int 很便宜,但它不是零。因此,从向量的开头/中间移除元素不可能是常数时间。

注意:在向量上调用 resize 以使其更小会删除最后的元素。

【讨论】:

  • 是否有任何库(您知道的)包括专门化以避免为 int 等简单类型调用伪 dtor?
  • 你有证据(比如,godbolt)证明图书馆调用了这样一个伪 dtor 吗?
  • @JerryCoffin 甚至我的向量教程也解释了如何进行优化。我希望专业的事情来做。 lokiastari.com/blog/2016/03/19/vector-simple-optimizations/…
  • @MarshallClow - 是的,我会使用 resize() 来减小尺寸。
  • 对不起,我不得不在那里做一些工作。我对 Marshall 的回答是,不,我没有测试过,所以我不确定。 @MartinYork:多想一下,我怀疑这是不必要的。为 dtor 是 nop 的类型调用 dtors 的循环可能应该作为死代码被消除(但请参见上文——我尚未测试确定)。
猜你喜欢
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
相关资源
最近更新 更多