c – 迭代器在项目上调用next()/ previous()时会产生不同的行为

我已经创建了一个简单的映射和迭代器.

当我将迭代器移动到下一个项目时,它表现良好.在转发迭代器之后,如果我要求它返回前一个项并获取迭代器的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风格迭代器的行为.迭代器有两个与它们相关的重要状态:

>立场.
>方向.

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

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

点赞