Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 迭代器在对项调用next()/previous()时应具有不同的行为_C++_Qt_Iterator_Qmap - Fatal编程技术网

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

C++ 迭代器在对项调用next()/previous()时应具有不同的行为,c++,qt,iterator,qmap,C++,Qt,Iterator,Qmap,我已经创建了一个简单的映射和一个迭代器。 当我将迭代器移动到下一个项目时,它的性能很好。在转发迭代器之后,如果我要求它返回到上一个项并获取迭代器的value(),它实际上不是上一个项的值,实际上该值根本没有更改。好像有什么不对劲,或者我用错了方法!问题在哪里 请参阅下面的代码 #include "mainwindow.h" #include <QApplication> #include <QMap> #include <qiterator.h> int m

我已经创建了一个简单的映射和一个迭代器。 当我将迭代器移动到下一个项目时,它的性能很好。在转发迭代器之后,如果我要求它返回到上一个项并获取迭代器的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();
}
#包括“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