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

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

本文关键字:迭代器 调用 期望 next previous      更新时间:2023-10-16

我已经创建了一个简单的映射和一个迭代器。当我将迭代器移动到下一项时,它执行得很好。在转发迭代器之后,如果我要求它返回前一项并获取迭代器的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. 方向。

在所有情况下,迭代器都指向它最近遍历的项

使用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++风格的迭代器更容易应用。