是
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);
}我想知道这是否有必要避免擦除整个向量的性能损失。如果没有惩罚,我更喜欢保持我的代码清晰,并使用单行语句。
发布于 2013-09-19 22:09:55
查看vector的源代码(参考visual Studio2012(下面的代码片段)或SGI (第434行)),clear定义为:
void clear() _NOEXCEPT
{ // erase all elements
erase(begin(), end());
}所以我想是的。
因此,在您的情况下,我不会使用if语句,而只是这样做:
v.erase(v.begin(), last_it);发布于 2013-09-19 22:10:21
不要担心这一点,使用erase编写显而易见的代码。如果擦除到最后,将没有任何元素可以向下移动,因此两者之间的性能差异应该是最小的。
发布于 2013-09-19 23:10:01
问题是您的问题没有一个单一的答案,因为没有在所有平台上使用的C++标准库的单一实现。该标准唯一指定的是clear操作的algorithmic complexity。具体地说,对于可销毁的类型,它可以是恒定的时间;对于需要销毁的类型,它的销毁次数将是线性的。这是您从C++标准中得到的唯一保证。
标准库通常是作为编译器安装的一部分分发的,所以像这样的具体实现细节可能会因编译器而异。如果你只关心一个编译器版本,你可以给出一个答案,但要认识到,如果你改变了平台,它可能会发生变化。
https://stackoverflow.com/questions/18896931
复制相似问题