为什么我不能在列表迭代器上使用+ =运算符?

时间:2017-04-26 14:52:01

标签: c++ c++11 iterator stdlist

我有std::list<std::string>的迭代器,但是当我尝试使用+=推进它时,我收到编译错误。

代码是:

#include <list>
#include <iostream>
#include <string>
int main() {
    std::list<std::string> x;

    x.push_front("British");
    x.push_back("character");
    x.push_front("Coding is unco");
    x.push_back("Society");
    x.push_back("City Hole");
    auto iter = x.begin();
    iter += 3;
    //std::advance(iter, 3);
    x.erase(iter);

    for (auto &e: x) {
        std::cout << e << "\n";
    }
}

如果我使用clang++ -std=c++11 -o li li.cpp编译,我得到:

li.cpp:13:10: error: no viable overloaded '+='
    iter += 3;
    ~~~~ ^  ~
1 error generated.

为什么我不能将+=与此迭代器一起使用?

3 个答案:

答案 0 :(得分:15)

std::list的迭代器是BidirectionalIterator,它不支持operator+= operator++ {/ 3}}。

您可以使用RandomAccessIterator支持的BidirectionalIterator(包括++iter; ++iter; ++iter; ),例如

BidirectionalIterator

但它很难看。最好的方法就是您评论,使用InputIterator(或std::advance(自C ++ 11))代替,可以与std::next一起使用(包括RandomAccessIterator) ,并利用InputIt支持的功能。

(强调我的)

  

复杂性

     

线性

     

但是,如果RandomAccessIterator另外满足要求   std::advance复杂性不变

所以你可以在不考虑迭代器类别的情况下使用它,std::advance(iter, 3); 将为你做最好的选择。 e.g。

iter = std::next(iter, 3);

application.properties

答案 1 :(得分:5)

原因很简单,没有为您正在使用的双向迭代器定义+=运算符。

对于所有迭代器至少有:

  • 复制 - 可分配和可破坏,即X b(a);b = a;
  • 可以递增,即++aa++

其他所有内容取决于迭代器的类型,请查看表here

enter image description here

正如您所看到的那样,随机访问迭代器可以解决问题。

答案 2 :(得分:3)

std::list::iterator不是Random Access Iterator。不可能“超前”#34;列表中的几个元素,您必须遍历列表,直到到达所需的元素。您可以使用std::advance来推断基于迭代器类别推进迭代器的最佳方法。在std::list::iterator的情况下,它将在循环中递增迭代器。