0

我有一个std::list<int>和一个std::vector<int>。我想从中删除偶数元素,并在其中复制奇数元素。

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

向量

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<int>在该行显示错误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<T>::iterator?以及为什么简单+操作员的消息?我什至没有创建一个reverse_iterator

我知道 avector是一个连续的结构,而 alist不是。但是,考虑到后增量是适用的,这有什么关系呢?这个问题是list唯一的,还是其他一些容器也有这个问题?

4

1 回答 1

3

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

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

顺便说一句,你的 for 循环std::vector看起来不太好 - 在 a 中插入和删除std::vector 会使迭代器(包括你用来迭代你的向量的那些)无效;您应该更改算法的方法(也许最简单的方法就是将元素复制到单独的vector.

于 2013-07-09T19:40:58.560 回答