C++ 迭代器在对项调用next()/previous()时应具有不同的行为
我已经创建了一个简单的映射和一个迭代器。 当我将迭代器移动到下一个项目时,它的性能很好。在转发迭代器之后,如果我要求它返回到上一个项并获取迭代器的value(),它实际上不是上一个项的值,实际上该值根本没有更改。好像有什么不对劲,或者我用错了方法!问题在哪里 请参阅下面的代码C++ 迭代器在对项调用next()/previous()时应具有不同的行为,c++,qt,iterator,qmap,C++,Qt,Iterator,Qmap,我已经创建了一个简单的映射和一个迭代器。 当我将迭代器移动到下一个项目时,它的性能很好。在转发迭代器之后,如果我要求它返回到上一个项并获取迭代器的value(),它实际上不是上一个项的值,实际上该值根本没有更改。好像有什么不对劲,或者我用错了方法!问题在哪里 请参阅下面的代码 #include "mainwindow.h" #include <QApplication> #include <QMap> #include <qiterator.h> int m
#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();
}
#包括“mainwindow.h”
#包括
#包括
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QMap地图;
地图.插入(4234,3);
地图.插入(4200,2);
插入地图(4100,1);
地图.插入(4000,0);
qmapiteratori(map);
i、 toFront();
i、 next();
i、 next();
int va1=i.value();//val1按预期为1
i、 先前的();
int val2=i.value();//预期val2应该是0,但仍然意外地是1!!!!
返回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();
}
如果您没有预料到这种行为,那么C++风格的迭代器可能更容易应用。如果在迭代器上循环并打印值,您会得到什么?我猜您会得到0,1,2,3(因为这是键的顺序,而不是值)。。。这意味着当你执行next()next()previous()-你会得到第二个值-a 1注意:我这样问是因为我没有安装QT是因为键的顺序是:0,1,2,3。通过first-next()值为0,通过第二个next()值为1,因此通过调用previous(),我希望迭代器指向第一项,但I.value()仍然返回第二项!所以问题是为什么第一个测试,在front()之后,next()next()value()是1而不是2。不,问题是为什么在front()之后,next()next()previous(),value()是1而不是0!因为前面是0,所以next(),next(),previous()可以收缩为“next()”,也就是1。
4000 0
4100 1
4100 1
4000 0