【发布时间】:2011-09-27 06:45:14
【问题描述】:
通常认为删除std::vector 中间的元素代价高昂,因为它需要复制它之后的每个元素以填充孔。
在 C++11 中,std::vector 会将所有元素移动,这应该非常快(如果仅与副本相关),至少我认为是这样。当然,它在时间上仍然是线性的,但总的来说应该比旧版本更快。
这是真的吗?我不再担心删除中间的一些对象了吗?
【问题讨论】:
-
在 C++03 中不能交换对象吗?如果是这样,性能差异将非常小。'
-
@jalf:嗯,这就是
unafe_erase的工作原理——swap与 last 和pop_back,但如果你想保持订单,你不能只是交换。 -
@Xeo:与从中间移除然后将元素移动一个到向量末尾的方式相同,您可以swap 与下一个元素一起移除的元素,移动到向量的末尾,然后调用
pop_back。 -
@jalf:据我所知,只有 VC9 在其 STL 中执行“交换”,因为容器不需要有效地保存可交换元素。
-
@David:在您对@Xeo 的回复中,您似乎在描述一种更复杂、更随意的方式来实现同样的目标?
标签: c++ vector c++11 move-semantics