C++列表迭代器算术?

Sco*_*ott 2 c++ iterator list

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

下面是一些代码:

  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
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我想要做的是让j从队列中的下一个位置开始.原因是我不想检查第一个项目.错误本身来自我指定的代码中的部分itr + 1.现在我确定使用指针你可以像这样算术,为什么它不能使用列表迭代器(这基本上是相同的东西?)

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

uk4*_*321 6

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

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


For*_*veR 5

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

for (list<Term>::iterator j = next(itr); j != final.end(); ++j)
Run Code Online (Sandbox Code Playgroud)

要么

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

  • 为什么你会用常量参数1调用`std :: advance`,在所有可能的情况下都是`++`? (2认同)