期望迭代器在对项调用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++风格的迭代器更容易应用。
相关文章:
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?
- 如何将迭代器调用转发给类的私有成员?
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 矢量迭代器在尝试调用函数时使我的程序崩溃
- 从基于迭代器的for循环转换后,如何在map::find()中调用方法
- 如何在单个模板调用中传递const_iterator和非const迭代器
- 迭代器的模板参数:函数在调用时推断类型?
- 调用模板函数的问题"No matching function for call"参数:迭代器、对象函数
- 如果容器不是调用函数中的引用,则使用 std::thread 传递对迭代器的引用将失败
- 通过迭代器调用功能无法在派生对象上编译
- 如何使用for循环使用反向迭代器调用erase
- 通过迭代器调用函数
- 从迭代器调用函数
- 从迭代器调用方法
- C++:向量::擦除用迭代器调用
- 使用随机访问迭代器调用模板函数
- 使用zip迭代器调用boost::compute::sort()会导致构建错误
- 从迭代器调用.value()会导致Appcrash
- 使用迭代器调用STL Set中的非静态函数
- 使用先前已移动的输出迭代器调用move()是标准的c++吗?