在对项目调用 next()/previous() 时,迭代器预计会有不同的行为

iterator expected to have different behaviour when calling next()/previous() on items

我创建了一个简单的地图和一个迭代器。 当我将迭代器移动到下一个项目时,它表现良好。转发迭代器后,如果我要求它返回上一个项目并获取迭代器的 value(),它实际上不是前一个项目值,实际上该值根本没有改变。似乎有什么不对劲或者我用错了方法!问题出在哪里?

看下面的代码

#include "mainwindow.h"
#include <QApplication>
#include <QMap>
#include <qiterator.h>

int main(int argc, char *argv[])

{
    QApplication a(argc, argv);

QMap<double,int> map;
map.insert(4234,3);
map.insert(4200,2);
map.insert(4100,1);
map.insert(4000,0);

QMapIterator<double, int> i(map);
i.toFront();

i.next();
i.next();
int va1 = i.value();    // val1 is 1 as expected

i.previous();

int val2 = i.value(); // It is expected that val2 should be 0 but is still Surprisingly 1!!!!

return a.exec();
}

这是设计使然,也是 Java 式迭代器的行为。迭代器有两个重要的状态片段:

  1. 位置。
  2. 方向。

在所有情况下,迭代器都指向它最近跨过的项目

使用next()previous() 反转迭代器的方向。在 next() 之后,迭代器向右移动并指向其 左侧 的项目。在 previous() 之后,迭代器向左移动并指向其 右侧 的项目。

这是带注释的执行顺序。 - 标志指示基于迭代器方向的指向值。 v 符号表示迭代器位置。

i.toFront();
-v
  4000 4100 4200 4234
  0    1    2    3

i.next();
  ----v
  4000 4100 4200 4234
  0    1    2    3

i.next();
       ----v
  4000 4100 4200 4234
  0    1    2    3

i.previous();
      v----
  4000 4100 4200 4234
  0    1    2    3

i.previous();
 v----
  4000 4100 4200 4234
  0    1    2    3

测试用例:

#include <QtCore>
int main()
{
   QMap<double, int> map;
   map.insert(4234., 3);
   map.insert(4200., 2);
   map.insert(4100., 1);
   map.insert(4000., 0);

   QMapIterator<double, int> i(map);
   i.toFront();

   i.next();
   qDebug() << i.key() << i.value();
   i.next();
   qDebug() << i.key() << i.value();

   i.previous();
   qDebug() << i.key() << i.value();
   i.previous();
   qDebug() << i.key() << i.value();
}

输出:

4000 0
4100 1
4100 1
4000 0

如果您没有预料到这种行为,也许 C++ 风格的迭代器会更容易应用。