2016-01-11 118 views
5

我有一种情况。我为我的一项任务使用了模板化功能。对于这个函数,我通过引用传递迭代器。现在,我必须从矢量中删除几个元素。我如何仅使用迭代器来做到这一点? 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)很容易..

我也意识到,它不是一个很好的方式,我通过引用传递迭代器。但是我遵循简单的规则:当某些东西需要更改或避免大量复制时使用引用。我的情况是适合的第一个条件。

那么如何删除?

回答

6

如果您拥有的只是容器元素的迭代器,则无法修改容器。迭代器的重点在于将容器的概念与元素范围的概念分离开来,这样算法就可以在不考虑前者的情况下通用地表达。这也是为什么我们有一个remove算法可以对一个范围进行置换,而可以返回这个迭代器适用于从容器中清除元素,但是需要由知道容器的人来完成删除操作。

+1

参见['std :: erase(std :: remove_if())'idiom](http://en.cppreference.com/w/cpp/算法/删除) – YSC

+1

@YSC我不认为有'std :: erase'。关键是你需要一个'std :: vector'实例来调用'std :: vector :: erase'。 – juanchopanza

+0

@juanchopanza不是这里不是。虽然我不能编辑。周一早上错字。 – YSC

2

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

+0

_“从容器中删除元素将无效所有迭代器” _ - 这是不正确。不同的容器有不同的迭代器失效规则用于擦除。参见http://stackoverflow.com/a/6442829/6345 –

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

    此外,不要忘记,从矢量擦除将导致所有迭代器无效。

  2. 其他库:Boost.Intrusive有一些容器,让您只是一个指向对象(兼作迭代器)做任何事情,但他们链表,这通常比大多数的目的载体效率较低。