首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对整个范围使用vector::erase

对整个范围使用vector::erase
EN

Stack Overflow用户
提问于 2013-09-19 22:06:01
回答 3查看 269关注 0票数 8

代码语言:javascript
复制
v.erase(v.begin(), v.end());

就像

代码语言:javascript
复制
v.clear();

我不关心额外的函数调用等小开销,编译器会内联这些东西。

我问这个问题的原因是因为我有如下代码:

代码语言:javascript
复制
v.erase(v.begin(), last_it);

last_it通常是结束迭代器,但并不总是如此。我知道擦除一个不是从末尾开始的向量是有代价的,因为向量中后面的元素需要被复制下来。在last_it不是结束迭代器的情况下(很少见),我可以接受。但是当我基本上想要清除向量时,我不想引入这样的开销。所以我考虑这样写我的代码:

代码语言:javascript
复制
if (last_it == v.end())
{
    v.clear();
}
else
{
    v.erase(v.begin(), last_it);
}

我想知道这是否有必要避免擦除整个向量的性能损失。如果没有惩罚,我更喜欢保持我的代码清晰,并使用单行语句。

EN

回答 3

Stack Overflow用户

发布于 2013-09-19 22:09:55

查看vector的源代码(参考visual Studio2012(下面的代码片段)或SGI (第434行)),clear定义为:

代码语言:javascript
复制
void clear() _NOEXCEPT
{   // erase all elements
    erase(begin(), end());
}

所以我想是的。

因此,在您的情况下,我不会使用if语句,而只是这样做:

代码语言:javascript
复制
v.erase(v.begin(), last_it);
票数 8
EN

Stack Overflow用户

发布于 2013-09-19 22:10:21

不要担心这一点,使用erase编写显而易见的代码。如果擦除到最后,将没有任何元素可以向下移动,因此两者之间的性能差异应该是最小的。

票数 8
EN

Stack Overflow用户

发布于 2013-09-19 23:10:01

问题是您的问题没有一个单一的答案,因为没有在所有平台上使用的C++标准库的单一实现。该标准唯一指定的是clear操作的algorithmic complexity。具体地说,对于可销毁的类型,它可以是恒定的时间;对于需要销毁的类型,它的销毁次数将是线性的。这是您从C++标准中得到的唯一保证。

标准库通常是作为编译器安装的一部分分发的,所以像这样的具体实现细节可能会因编译器而异。如果你只关心一个编译器版本,你可以给出一个答案,但要认识到,如果你改变了平台,它可能会发生变化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18896931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档