首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用std::vector.erase(begin(),end())或std::vector.erase(begin(),begin())安全吗?

使用std::vector.erase(begin(),end())或std::vector.erase(begin(),begin())安全吗?
EN

Stack Overflow用户
提问于 2012-12-18 01:10:22
回答 3查看 1.7K关注 0票数 4

我想在一段时间内处理向量中的元素。为了优化这一点,我不想在处理项目时删除它,而是在最后删除所有已处理的项目。

代码语言:javascript
复制
vector<Item*>::iterator it;
for(it = items.begin(); it != items.end(); ++it)
{
    DoSomething(*it);

    if(TimeIsUp())
    {
        break;
    }
}

items.erase(items.begin(), it);

it == items.end()时使用擦除安全吗?在文档中说erase()将擦除[第一个,最后一个],这应该是安全的,但我想确认一下。

编辑:

使用std::vector.erase(begin(),begin())安全吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-18 01:44:35

[first,last)指的是firstlast之间的一切,包括first,但不包括last。它表示一个半开集合。如果他们使用[first,last]last也将包括在内;如果他们使用(first,last)firstlast将被排除在外。

您的代码有问题。如果it不等于end(),您希望删除it处的元素。而不是items.erase (items.begin(),it),您应该使用

代码语言:javascript
复制
if (it != items.end()) {
   items.erase (items.begin(), it+1);
}
else {
   items.clear(); // same as items.erase (items.begin(), items.end())
}
票数 1
EN

Stack Overflow用户

发布于 2012-12-18 01:11:34

是的,这是正确的-这就是符号[first, last)end()指向末尾的意思。

票数 5
EN

Stack Overflow用户

发布于 2012-12-18 01:23:32

回答你的编辑:是的,这也很好。vec.erase(q1,q2)被定义为擦除“range [q1, q2)中的元素”。在这里,这两个论点是相同的。[q1, q2)被定义为常量迭代器的有效范围。如果您可以对q1执行一系列递增操作以获得q2,则范围被认为是有效的-在这种情况下,该序列没有递增。事实上,该标准特别定义了一个空范围:

范围[i,i)是空范围

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

https://stackoverflow.com/questions/13918706

复制
相关文章

相似问题

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