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

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() 是否安全?文档中提到 erase() 将擦除 [first, last) ,这应该是安全的,但我想确认一下。

编辑:

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


2
我强烈建议不要使用常规指针的vector。要么使用专门设计用于容纳指针的容器,要么使用智能指针的vector。(可能的例外情况是,如果向量不拥有它所指向的对象。) - David Schwartz
@Cristy:我认为这并不完全是重复的问题,另一个问题是因为将迭代器递增到超出“end”而导致崩溃。它仅包含了“erase”和“end”,只是附带的内容。 - Damon
我确实想知道为什么向量无法被“清除”。 - Damon
@Damon 因为it可能并不总是等于items.end() - Praetorian
@Praetorian:哦,我真是太蠢了……你说得对。我读成了“删除之后的所有元素”,而不是“删除所有已处理的元素”。 - Damon
3个回答

5

是的,这是正确的 - 这就是符号 [first, last) 的含义,而 end() 指向最后一个元素的下一个位置。


3
回答你的问题:是的,那样也可以。 vec.erase(q1,q2) 被定义为删除“范围内的元素[q1, q2)”。在这里,两个参数是相同的。 [q1, q2) 被定义为有效的 const 迭代器范围。如果可以通过一系列的增量操作使q1变成q2,则该范围被认为是有效的 - 在这种情况下,序列没有任何增量操作。实际上,标准专门定义了一个空范围:

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


1

[first,last)的意思是指firstlast之间的所有元素,包括first但不包括last。它表示一个半开放集合。如果使用了[first,last],那么last也会被包括在内;如果使用了(first,last),那么firstlast都将被排除。

您的代码存在问题。如果it不等于end(),则要删除it处的元素。您应该使用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())
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接