【问题标题】:Which is most costly in C++, remove last element or resize of a vector?C++ 中哪个成本最高,删除最后一个元素或调整向量的大小?
【发布时间】:2014-08-01 04:38:38
【问题描述】:

C++ 中哪个操作成本最高?
1. 调整向量的大小(将大小减小 1)
2. 删除向量中的最后一个元素

【问题讨论】:

  • 在优化库中也不会发生重新分配。
  • @deviantfan 我认为如果将大小调整为较小的大小,不会发生任何重新分配。我认为这甚至是不允许的。
  • @deviantfan 它是如何依赖于实现的?我认为你在这里传播混乱(注意没有resize_to_fit。)
  • 是的,它是 shrink_to_fit ...我自己也很困惑。请忽略我的 cmets(或者我现在删除它们)

标签: c++ c++11 vector resize


【解决方案1】:

来自http://en.cppreference.com/w/cpp/container/vector,它基本上引用了标准:

void pop_back();

删除容器的最后一个元素。 除了 back()end() 之外,没有任何迭代器或引用无效。

void resize( size_type count );

调整容器的大小以包含 count 个元素。如果当前大小 大于计数,容器减少到它的第一个计数 元素就像通过反复调用pop_back()

所以在这种情况下,调用resize(size() - 1) 应该等同于调用pop_back()。但是,致电pop_back() 是正确的做法,因为它表达了您的意图

注意:答案反映了 C++11 的 std::vector::resize()changed interface,它曾经包含一个隐藏的默认参数,该参数被复制(可能有也可能没有)已被优化掉)。

【讨论】:

  • 另外,pop_back() 不会使迭代器或引用无效,因此不会发生重新分配。
  • @juanchopanza 当然,但缩小调整大小也不会使任何内容无效,因为它们相当于一系列 pop_backs。虽然更新了完整的报价。 Tnx!
  • 对。 resize() 更小的尺寸是根据 erase 的 teo-iterator 版本描述的,它只能使迭代器或对被擦除元素的引用无效。所以resizepop_backerase 应该是等价的。
【解决方案2】:

在我看来它们是等价的。这两个操作都删除了最后一个元素并减小了大小。:)

根据 C++ 标准

void 调整大小(size_type sz); 12 效果:如果 sz 等效 调用 pop_back() size() - sz 次

因此,根据我的观点和标准的观点,它们只是等效的。:)

另外,如果考虑成员函数erase 而不是pop_back(实际上他们在这种情况下做同样的事情)然后根据相同的标准

4 复杂度:T的析构函数被调用的次数相等 到删除的元素的数量,但移动分配 T 的算子被调用的次数等于被调用的次数 删除元素之后的向量中的元素。

由于最后一个元素没有移动操作,所以成本是一样的。

【讨论】:

  • @user2899162 您是指错误的 cmets,还是正确的 cmets? :-)
  • @user2899162 那么,你知道这样的实现而不是你的 bla,bla,bla 吗?
  • 注意在当前标准resize 中以较小的尺寸表示为erase,但同样的结论成立:没有重新分配。
猜你喜欢
  • 2012-08-20
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 2021-06-29
相关资源
最近更新 更多