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

时间:2012-12-17 17:10:22

标签: c++ stl

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

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())吗?

3 个答案:

答案 0 :(得分:5)

是的,这是正确的 - 这是符号[first, last)的含义,而end()指的是结尾。

答案 1 :(得分:3)

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

  

范围[i,i)是空范围

答案 2 :(得分:1)

[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())
}