繁体   English   中英

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

[英]Is it safe to use std::vector.erase(begin(), end()) or std::vector.erase(begin(), begin())?

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

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()将擦除[first,last],这应该是安全的,但我想确定。

编辑:

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

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

回答你的编辑:是的,那也没关系。 vec.erase(q1,q2)定义为擦除“ [q1, q2)范围内的元素”。 这两个论点都是一样的。 [q1, q2)被定义为const迭代器的有效范围。 如果有一系列增量可以对q1进行到q2 ,则认为范围是有效的 - 在这种情况下,序列没有增量。 实际上,该标准专门定义了一个空范围:

范围[i,i)是空范围

[first,last)意味着什么是firstlast之间的一切,包括first但不包括last 它表示半开集。 如果他们使用[first,last] ,也会包含last ; 如果他们使用(first,last)firstlast将被排除在外。

您的代码存在问题。 你想在元素it被删除,如果it不等于end() 你应该使用而不是items.erase (items.begin(),it)

if (it != items.end()) {
   items.erase (items.begin(), it+1);
}
else {
   items.clear(); // same as items.erase (items.begin(), items.end())
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM