【问题标题】:C++ list iterator arithmetic?C ++列表迭代器算术?
【发布时间】:2013-11-25 14:54:32
【问题描述】:

我正在尝试使用迭代器创建一组循环,但我遇到了一些迭代器算术问题(我认为这是可能的,但不起作用)。

下面是一些代码:

  for (list<Term>::iterator itr = final.begin(); itr != final.end(); itr++) {
        for(list<Term>::iterator j = itr + 1; j != final.end(); j++) {
            cout << itr->term << " " << j->term;
            if(itr->term == j->term) {
                //Do stuff
            }
        }
    }

我想要做的是让 j 从 itr 开始从队列中的下一个位置开始。这样做的原因是我不想检查第一个项目本身。错误本身来自我指定itr + 1 的代码部分。现在我确信使用指针可以进行​​这样的算术运算,为什么它不能与列表迭代器一起使用(本质上是一样的?)

我从 IDE 得到的错误如下:main.cpp:237:48: error: no match for ‘operator+’ in ‘itr + 1’。我再次认为您可以对迭代器进行这种算术运算,所以我不确定该怎么做才能使这项工作正常进行,是否可以尝试其他实现?

【问题讨论】:

    标签: c++ list iterator


    【解决方案1】:

    list 迭代器不是随机访问,因此您不能对它们进行+。它们是双向迭代器,因此您可以执行的唯一移动操作是 --++。您可以复制并在其上使用++,也可以复制并使用std::advance(it, 1)

    对于 C++11,还有 std::next,它为您提供 it + 1,而您不必像其他人一样显式地制作命名副本。

    【讨论】:

    • 您是建议我复制内部或外部迭代器吗?我假设您的意思是外部循环迭代器,然后在循环结束后将其修复?
    • @Scott 您需要复制itr 并单独增加它,例如list&lt;Term&gt;::iterator j = itr; ++j。对于std::next,你可以只做list&lt;Term&gt;::iterator j = std::next(itr)(或者auto j = std::next(itr)对于C++11,如果你有next
    【解决方案2】:

    list 有双向迭代器,不支持operator +。您可以在 C++11 中使用 std::advancestd::next

    for (list<Term>::iterator j = next(itr); j != final.end(); ++j)
    

    list<Term>::iterator j = itr;
    advance(j, 1); // or ++j
    for (; j != final.end(); ++j)
    

    【讨论】:

    • 为什么在所有情况下都可以调用std::advance 并使用常量1,++ 也是如此?
    猜你喜欢
    • 2015-10-24
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 2020-10-05
    • 2019-01-30
    • 2013-02-07
    相关资源
    最近更新 更多