【问题标题】:Difference in behaviour of list<int>::iterator and vector<int>::iteratorlist<int>::iterator 和 vector<int>::iterator 的行为差异
【发布时间】:2013-07-09 19:22:28
【问题描述】:

我有一个std::list&lt;int&gt; 和一个std::vector&lt;int&gt;。我想从中删除 even 元素,并在其中复制 odd 元素。

我对它们都有两个不同的功能:

矢量

std::vector<int> vec_remove_even_duplicate_odd(std::vector<int> target) {
    std::vector<int>::iterator begin = target.begin();

    while (begin != target.end()) {
        if (*begin % 2 == 0) {
            begin = target.erase(begin);
        } else {
            begin = target.insert(begin, *begin);
            begin += 2;
        }
    }

    return target;
}

这很好用。但是std::list&lt;int&gt; 的相同函数在begin += 2 行显示错误:

error: no match for ‘operator+=’ (operand types are ‘std::list<int>::iterator {aka std::_List_iterator<int>}’ and ‘int’)

如果我将其更改为:

begin = begin + 2

它显示以下注释:

note:   mismatched types ‘const std::reverse_iterator<_Iterator>’ and ‘int’

但是,如果我将该行更改为:

++begin;
++begin;

它也适用于list。那么这种行为是什么,我在阅读容器时可能会错过。

为什么没有为std::list&lt;T&gt;::iterator 定义+= 运算符?以及为什么简单的+ 操作员的消息?我什至还没有创建reverse_iterator

我知道vector 是一个连续 结构,而list 不是。但是,考虑到 post-increment 是适用的,这又有什么关系呢? 这个问题是特定于list 的,还是其他一些容器也有这个问题?

【问题讨论】:

标签: list c++11 vector iterator operators


【解决方案1】:

由于std::list 实际上是一个链表,它的迭代器只提供在这种数据结构中实现的微不足道的功能;特别是,std::list 迭代器是所谓的 双向迭代器,而不是 随机访问 迭代器,因此它们既不提供 operator+= 也不提供 operator+,因此消息你明白了。

如果在通用算法中您需要前进 n 个元素,无论操作的计算成本如何,您都可以使用std::advance,它将使用operator+= 进行随机迭代器和在其他情况下重复应用++--

顺便说一句,std::vector 的循环看起来不太好 - 在 std::vector can invalidate iterators 中插入和删除(包括用于迭代向量的循环);您应该更改算法的方法(也许最简单的方法就是将元素复制到单独的 vector 中)。

【讨论】:

  • 另外,std::distance 也很方便。而且,std::nextstd::prev 在 C++11 中也是如此。
  • 谢谢@Matteo。不知道不同类型的迭代器。现在很清楚了。 :)
  • 感谢@Matteo 的建议。我刚开始学习C++。所以,希望能逐渐了解这些问题。 :)
  • @RohitJain:准备好,C++ 是一头丑陋的野兽 :) - 顺便说一下,在编写用于容器的算法时,请查看 the header &lt;algorithm&gt; 的内容,您可能会发现大部分工作已经完成了。
  • @MatteoItalia。这肯定是一个标题中的少数算法。谢谢。一旦我自己学会了如何做,可能会有用。 :) 是的,它似乎是一种复杂的语言。既然我已经接受了挑战,那就面对吧:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 2010-11-21
  • 2011-04-13
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多