我想在一段时间内处理向量中的元素。为了优化这一点,我不想在处理项目时删除它,而是在最后删除所有已处理的项目。
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()将擦除[第一个,最后一个],这应该是安全的,但我想确认一下。
编辑:
使用std::vector.erase(begin(),begin())安全吗?
发布于 2012-12-18 01:44:35
[first,last)指的是first和last之间的一切,包括first,但不包括last。它表示一个半开集合。如果他们使用[first,last],last也将包括在内;如果他们使用(first,last),first和last将被排除在外。
您的代码有问题。如果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())
}发布于 2012-12-18 01:11:34
是的,这是正确的-这就是符号[first, last)和end()指向末尾的意思。
发布于 2012-12-18 01:23:32
回答你的编辑:是的,这也很好。vec.erase(q1,q2)被定义为擦除“range [q1, q2)中的元素”。在这里,这两个论点是相同的。[q1, q2)被定义为常量迭代器的有效范围。如果您可以对q1执行一系列递增操作以获得q2,则范围被认为是有效的-在这种情况下,该序列没有递增。事实上,该标准特别定义了一个空范围:
范围
[i,i)是空范围
https://stackoverflow.com/questions/13918706
复制相似问题