c – 迭代器在项目上调用next()/ previous()时会产生不同的行为
发布时间:2020-12-16 07:17:43 所属栏目:百科 来源:网络整理
导读:我已经创建了一个简单的映射和迭代器. 当我将迭代器移动到下一个项目时,它表现良好.在转发迭代器之后,如果我要求它返回前一个项并获取迭代器的value(),它实际上不是前一项值,实际上该值根本没有改变.似乎有些不对劲,或者我可能以错误的方式使用它!问题出在
我已经创建了一个简单的映射和迭代器.
当我将迭代器移动到下一个项目时,它表现良好.在转发迭代器之后,如果我要求它返回前一个项并获取迭代器的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风格的迭代器会更容易应用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |