4

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

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()) 是否安全?

4

3 回答 3

5

是的,这是正确的——这就是符号的[first, last)含义,并且end()指向末尾。

于 2012-12-17T17:11:34.040 回答
3

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

范围[i,i)是一个空范围

于 2012-12-17T17:23:32.170 回答
1

这意味着和[first,last)之间的一切,包括但不包括。它表示一个半开集。如果他们使用,也会被包括在内;如果他们使用过,就会被排除在外。firstlastfirstlast[first,last]last(first,last)firstlast

你的代码有问题。如果不等于 ,您希望it删除at 的元素。而不是,您应该使用itend()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())
}
于 2012-12-17T17:44:34.923 回答