关于QMap对象改变后遍历输出的问题

锄手 2016-12-21 04:29:18
QMap<QString,QString> map;
map.insert("Beijing","111");
map.insert("Shanghai","021");
map.insert("Nanjing","025");
QMutableMapIterator<QString,QString> mi(map);
for(;mi.hasNext();)
qDebug()<<" "<<mi.key()<<" "<<mi.next().value();
if(mi.findNext("111"))
mi.setValue("010");
qDebug()<<" ";
for(mi.toFront();mi.hasNext();)
qDebug()<<" "<<mi.key()<<" "<<mi.next().value();

为什么前后两次的输出并没有改变,"Beijing"对应的值仍为"111",而不是"010"。

只有按照书上的程序:
QMap<QString,QString> map;
map.insert("Beijing","111");
map.insert("Shanghai","021");
map.insert("Nanjing","025");
QMapIterator<QString,QString> i(map);
for(;i.hasNext();)
qDebug()<<" "<<i.key()<<" "<<i.next().value();
QMutableMapIterator<QString,QString> mi(map);
if(mi.findNext("111"))
mi.setValue("010");
qDebug()<<" ";
QMapIterator<QString,QString> modi(map);
for(;modi.hasNext();)
qDebug()<<" "<<modi.key()<<" "<<modi.next().value();
才能成功将"Beijing”对应的值改为"010"。

我试图将迭代器i的定义省去,将第一次显示各键、值的功能改为由mi实现,
QMap<QString,QString> map;
map.insert("Beijing","111");
map.insert("Shanghai","021");
map.insert("Nanjing","025");
QMutableMapIterator<QString,QString> mi(map);
for(;mi.hasNext();)
qDebug()<<" "<<mi.key()<<" "<<mi.next().value();
if(mi.findNext("111"))
mi.setValue("010");
qDebug()<<" ";
QMapIterator<QString,QString> modi(map);
for(;modi.hasNext();)
qDebug()<<" "<<modi.key()<<" "<<modi.next().value();
也同样不能讲"Beijing”对应的值改为"010"。

麻烦各位大神解答下吧。第一次发帖怕解释不清楚,有点啰嗦了,见谅见谅。
...全文
525 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
锄手 2016-12-21
  • 打赏
  • 举报
回复
找到原因了,只用mi是可以实现的…之所以没成功是因为第一次显示后迭代器指向QMap对象最后,因此接下来的findNext函数没有找到值"111",自然也不会将其替换
赵4老师 2016-12-21
  • 打赏
  • 举报
回复
引用 2 楼 qq_22243115 的回复:
我刚又试了下,第一次显示各键、值的功能由迭代器i实现,用读写迭代器mi将"111"改为"010",并由mi实现第二次显示更改后的各键、值的功能,是可以成功将"Beijing”对应的值改为"010"的。到底是为啥……
理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
锄手 2016-12-21
  • 打赏
  • 举报
回复
我刚又试了下,第一次显示各键、值的功能由迭代器i实现,用读写迭代器mi将"111"改为"010",并由mi实现第二次显示更改后的各键、值的功能,是可以成功将"Beijing”对应的值改为"010"的。到底是为啥……
赵4老师 2016-12-21
  • 打赏
  • 举报
回复
只能删除再添加,我猜。 传说map内部是使用红黑树实现的。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧