我有一个情况。我已经使用模板化函数完成了我的任务之一。对于这个函数,我通过引用传递迭代器。现在,我必须从向量中删除一些元素。如何仅使用迭代器来完成此操作? Pl找到相应的代码:
template <class BidirectionalIterator, class Iterator> bool
SomeFunc( BidirectionalIterator& first, BidirectionalIterator& last, Iterator anotherVecBegin )
{
while((first+1) != last)
{
if(some_condition)
// delete (first); HOW?
else if(some_other_condition)
// delete (first + 1); HOW?
}
// add something to another vector using anotherVecBegin
return true;
}
有许多已经被问到的问题,但它们都有一个上下文中的向量。所以myVec.erase(*first)
很容易..
我也知道通过引用传递迭代器不是一个非常好的方法。但我遵循简单的规则:在预期某些事情发生变化时使用引用或避免重复复制。我的情景符合第一条件。
那我该怎么删除?
答案 0 :(得分:6)
如果您拥有的只是容器元素的迭代器,则无法修改容器。迭代器的重点在于将容器的概念与元素范围的概念分开,因此算法可以用后者来普遍表达,而不用关心前者。这也是为什么我们有一个remove
算法来置换一个范围而返回一个适合从容器中删除元素的迭代器,但是擦除需要由知道容器的人来完成。
答案 1 :(得分:2)
你做不到。从容器中删除元素将使所有迭代器无效,因此每次删除后都必须更新first
和last
。
答案 2 :(得分:2)
标准库:您必须获取对容器的引用,或将删除推迟到您拥有它的位置。没有其他办法了。需要容器来添加或删除元素,并且无法从迭代器中找到容器。
此外,不要忘记,从向量中删除会使对该向量的所有迭代器无效。
其他库:Boost.Intrusive有一些容器,只允许指向对象的指针(兼作迭代器),但它们是链表,通常效率低于向量用于大多数目的。