我想在一段时间内处理矢量中的元素。为了优化这一点,我不想在处理项目时删除它,并在最后删除所有已处理的项目。
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())吗?
答案 0 :(得分:5)
是的,这是正确的 - 这是符号[first, last)
的含义,而end()
指的是结尾。
答案 1 :(得分:3)
回答你的编辑:是的,那也没关系。 vec.erase(q1,q2)
被定义为删除“[q1, q2)
范围内的元素”。这两个论点都是一样的。 [q1, q2)
被定义为有效的const迭代器范围。如果有一系列增量可以q1
到q2
,则范围被认为是有效的 - 在这种情况下,序列没有增量。事实上,该标准明确定义了一个空范围:
范围
[i,i)
是空范围
答案 2 :(得分:1)
[first,last)
的含义是first
和last
之间的所有内容,包括first
但不包括last
。它表示半开集。如果他们使用[first,last]
,last
也会包括在内;如果他们使用了(first,last)
,first
和last
将被排除在外。
您的代码存在问题。如果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())
}