【问题标题】:Delete element using iterator, without knowing vector使用迭代器删除元素,不知道向量
【发布时间】:2016-04-15 13:28:47
【问题描述】:

我有一个情况。我为我的一项任务使用了模板化函数。对于这个函数,我通过引用传递迭代器。现在,我必须从向量中删除几个元素。我如何只使用迭代器来做到这一点?请找到相应的代码:

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) 很简单..

我也知道通过引用传递迭代器并不是一个很好的方法。但我遵循简单的规则:当某些东西需要改变或避免大量复制时使用引用。我的场景符合第一个条件。

那么我该如何删除呢?

【问题讨论】:

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


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

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

    2. 其他库:Boost.Intrusive 有一些容器可以让你只用一个指向对象的指针(它兼作迭代器)来做任何事情,但它们是链表,对于大多数情况来说,它们的效率通常低于向量目的。

    【讨论】:

      【解决方案2】:

      如果你只有容器元素的迭代器,你就不能修改容器。迭代器的全部意义在于将容器的概念与元素范围的概念分开,这样算法就可以用后者来普遍表达,而无需关心前者。这也是为什么我们有一个 remove 算法来置换一个范围并返回一个适合从容器中擦除元素的迭代器,但擦除需要由了解容器的人来完成。 p>

      【讨论】:

      • @YSC 我认为没有std::erase。关键是你需要一个std::vector 实例来调用std::vector::erase
      • @juanchopanza 不在这里不是。虽然我不能编辑。星期一早上错字。
      • @YSC:你可以点击删除,然后发表新评论。
      • “如果你只有迭代器,你就不能修改容器”——我认为这不准确。例如,当您使用std::iter_swap 时,就像排序算法所做的那样,您实际上修改 容器,即它的内容。否则,我同意删除元素。
      【解决方案3】:

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

      【讨论】:

      • “从容器中删除元素将使所有迭代器无效” - 这是不正确的。不同的容器对擦除有不同的迭代器失效规则。参见例如stackoverflow.com/a/6442829/6345
      猜你喜欢
      • 2016-09-24
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多