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

我有一个来自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.

为什么我不能使用=这个迭代器?

解决方法

std::list的迭代器是 BidirectionalIterator,它不支持operator = like RandomAccessIterator.

您可以使用InputIterator(包括BidirectionalIterator)支持的运算符

++iter;
++iter;
++iter;

但它很难看.最好的方法就是你所评论的,使用std::advance(或std::next(自C 11)),它可以与InputIterator(包括BidirectionalIterator)一起使用,并且还利用RandomAccessIterator支持功能.

(强调我的)

Complexity

Linear.

However,if InputIt additionally meets the requirements of
RandomAccessIterator,complexity is constant.

所以你可以在不考虑迭代器类别的情况下使用它,std :: advance将为你做最好的选择.例如

std::advance(iter,3);

要么

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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...