在对项目调用 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 式迭代器的行为。迭代器有两个重要的状态片段:
- 位置。
- 方向。
在所有情况下,迭代器都指向它最近跨过的项目。
使用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++ 风格的迭代器会更容易应用。
我创建了一个简单的地图和一个迭代器。 当我将迭代器移动到下一个项目时,它表现良好。转发迭代器后,如果我要求它返回上一个项目并获取迭代器的 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++ 风格的迭代器会更容易应用。