迭代器在调用next()/previous()时预期具有不同的行为

4
我已经创建了一个简单的地图和其上的迭代器。当我将迭代器移动到下一个项时,它表现良好。但是,在向前移动迭代器后,如果我要求它返回先前的项并获取迭代器的值(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();
}

如果您循环迭代器并打印值,会得到什么?我猜您会得到0、1、2、3(因为这是键的顺序,而不是值的顺序)...这意味着当您执行next() next() previous()时,您将获得第二个值-即1。注意:我之所以问是因为我没有安装QT。 - UKMonkey
是的,由于键的顺序,它应该是:0、1、2、3。通过第一个next(),值为0,通过第二个next(),值为1,因此调用previous()时,我希望迭代器指向第一个项目,但是i.value()仍然返回第二个项目! - Mosi
所以问题是为什么你的第一个测试,在 front()、next()、next()、value() 之后,值是1而不是2。 - UKMonkey
不,问题是为什么在 front()、next()、next()、previous() 之后,value() 的值是1而不是0! - Mosi
好的 - 因为前面是0,而next()、next()、previous()可以缩写成"next()" - 这就是1。 - UKMonkey
我已经删除了 front(),但结果仍然相同!!! - Mosi
1个回答

1
这是设计上的问题,也是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++风格的迭代器会更容易应用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接