时
v.erase(v.begin(), v.end());
和
一样快v.clear();
我不关心额外的函数调用等开销很小,编译器会内联这些东西。
我问的原因是因为我的代码如下:
v.erase(v.begin(), last_it);
last_it通常是结束迭代器,但并非总是如此。我知道擦除不是从末尾开始的向量会产生成本,因为向量中的后续元素需要向下复制。在last_it不是结束迭代器(罕见)的情况下,我可以忍受。但是当我基本上想要清除向量时,我不想引入这样的开销。所以我考虑写这样的代码:
if (last_it == v.end())
{
v.clear();
}
else
{
v.erase(v.begin(), last_it);
}
我想知道是否有必要避免因擦除整个矢量而造成的性能损失。如果没有惩罚,我宁愿保持我的代码清晰并使用单行语句。
答案 0 :(得分:8)
查看vector的源代码(参见visual studio 2012(下面的代码片段)或SGI(第434行)),clear
定义为:
void clear() _NOEXCEPT
{ // erase all elements
erase(begin(), end());
}
所以我想是的。
所以在你的情况下,我不会使用if语句,而只是这样做:
v.erase(v.begin(), last_it);
答案 1 :(得分:8)
不要担心这一点,并使用erase
编写明显的代码。如果你擦除到底,就不会有任何元素向下移动,所以两者之间的性能差异最小(如果有的话)。
答案 2 :(得分:1)
问题在于您的问题没有一个答案,因为没有单一的C ++标准库实现在所有平台上使用。标准唯一指定的是清除操作的algorithmic complexity。具体而言,对于易破坏的类型,它可以是恒定的时间;对于需要销毁的类型,它将是破坏数量的线性。这是您从C ++标准中获得的唯一保证。
标准库通常作为编译器安装的一部分进行分发,因此这样的确切实现细节可能因编译器而异。如果您只关注单个编译器版本,则可以提出答案,但要认识到如果您更换平台,它可能会发生变化。