gpt4 book ai didi

c++ - 在对项目调用 next()/previous() 时,迭代器预计会有不同的行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:15:12 25 4
gpt4 key购买 nike

我在上面创建了一个简单的 map 和一个迭代器。当我将迭代器移动到下一个项目时,它表现良好。转发迭代器后,如果我要求它返回上一个项目并获取迭代器的 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. 职位。
  2. 方向。

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

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

关于c++ - 在对项目调用 next()/previous() 时,迭代器预计会有不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40109145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com