使用迭代器删除元素,而不知道向量

时间:2016-01-11 09:37:07

标签: c++ templates c++11 vector iterator

我有一个情况。我已经使用模板化函数完成了我的任务之一。对于这个函数,我通过引用传递迭代器。现在,我必须从向量中删除一些元素。如何仅使用迭代器来完成此操作? 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)很容易..

我也知道通过引用传递迭代器不是一个非常好的方法。但我遵循简单的规则:在预期某些事情发生变化时使用引用或避免重复复制。我的情景符合第一条件。

那我该怎么删除?

3 个答案:

答案 0 :(得分:6)

如果您拥有的只是容器元素的迭代器,则无法修改容器。迭代器的重点在于将容器的概念与元素范围的概念分开,因此算法可以用后者来普遍表达,而不用关心前者。这也是为什么我们有一个remove算法来置换一个范围而返回一个适合从容器中删除元素的迭代器,但是擦除需要由知道容器的人来完成。

答案 1 :(得分:2)

你做不到。从容器中删除元素将使所有迭代器无效,因此每次删除后都必须更新firstlast

答案 2 :(得分:2)

  1. 标准库:您必须获取对容器的引用,或将删除推迟到您拥有它的位置。没有其他办法了。需要容器来添加或删除元素,并且无法从迭代器中找到容器。

    此外,不要忘记,从向量中删除会使对该向量的所有迭代器无效。

  2. 其他库:Boost.Intrusive有一些容器,只允许指向对象的指针(兼作迭代器),但它们是链表,通常效率低于向量用于大多数目的。