[英]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)
意味着什么是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())
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.