C ++列表迭代器算术?

时间:2013-11-13 05:59:05

标签: c++ list iterator

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

以下是一些代码:

  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 + 1的部分。现在我确定你可以用这样的指针进行算术运算,为什么它不能用于列表迭代器(基本上是同样的东西?)

我从IDE获得的错误如下:main.cpp:237:48: error: no match for ‘operator+’ in ‘itr + 1’。我再一次认为你可以在迭代器上做这种算法,所以我不确定该怎么做才能使这个工作,是否有我可以尝试的替代实现?

2 个答案:

答案 0 :(得分:5)

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)

答案 1 :(得分:4)

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

对于C ++ 11,还有std::next可以为您提供it + 1,而无需像对待其他人一样明确地创建命名副本。

相关问题