C_and_CPP 板


LINE

※ 引述《renderer (rendering)》之铭言: : ※ 引述《khoguan (Khoguan Phuann)》之铭言: : : 所谓「标准写法」其实和原po写的差不多,只是没有另外设一个 : : 暂时变数来存下一个 iterator 的值,而是用 postfix ++ 来做。 : : if (/* 符合条件 */) : : child.erase(i++); : : else : : ++i; : 对喔 iterator++ 是 iterator 自己先加 然後传一份原来的给 statement 做处理 : 不过在感情上总觉得 它不是挂了吗 怎麽还有办法 ++ Orz 您这种感情是有合理的基础的。;-Q : 问一个额外的问题 对於 primitive type 如 int : i++ 编辑器的处理是 : 做完 statement 再加 i 还是 : i 自己先加 但是传一份原本的 i 给 statement 做处理 i++ 一般简单的说法都是「先」取值「再」加一。这只是比较容易 解释,也比较容易听得懂的说法。其实这两者并无必然的先後关系。 int i = 10; i++; cout << i; i++ 是一个式子(expression, 而 i++; 多了分号的是 statement), 这整个式子会有一个evaluate後的值,这个值当然还是它原来的值(10), 但是,它另外也会有 side effect,也就是对 i 这个东东做加一的 动作。所以执行到 cout << i; 这个statement时,i 已经变成了 11。 但是加一这个动作到底是在那个精确的时间点完成的呢? i++; 叙述中的 i++ 是一个 full expression (因为它不是其他 expression 的 subexpression, 若是 i++ + 1; 这个叙述中的 i++ 就只是 subexpression)。一个 full expression 後面会有一个 概念上的 sequence point,所有在它之前的 side effect 到达 这个点时,都必须全部完成(而这个点之後的 side effect 则 必须尚未开始)。也就是在上一个 sequence point (A) 与下一个 sequence point (B)之间的所有 side effect 都要在到达 B 时 完成,不过,并不要求得要刚好就在 B 点完成,只要在这段期间内 完成即可,而不硬性规定(unspecified)。这是为了给编译环境依其 软硬体特性产生最有效率的机器码,而容许这种弹性。 至於最上面那个 child.erase(i++); 要进入那个函式之前,也会有 一个 sequence point, 所以 i++ 的 side effect 的部份也会完成, i 这个 iterator 已经顺利的指向下一个 map element 了。而erase() 函式本身接到的引数是原先的 iterator 值(rvalue),将它所对应的 元素删掉,对 map/set/list 等 node-based container 来说,不会 让其他的 iterator(包括已经指向下一个 map element 的 i) 也失效, 所以 i 可以继续安全的使用。 严格说来,child.erase(i++); 里的 ++ 是 overloaded operator function 不过效果还是和内建的 ++ 类似,都会在进入 erase() 之前就完成。 --
QR Code



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.130.208.168
1F:推 jeunder:真热心, 快去申请板主啦, 还在这不务正业 :( 61.230.216.76 07/01
※ 编辑: khoguan 来自: 220.130.208.168 (07/01 15:36)
2F:推 khoguan:呜~~ jeunder你们这些高人都不来带领大家220.130.208.168 07/01
3F:→ sekya:但是我记得erase正确用法是 i = child.erase( i ); 59.104.35.123 07/01
4F:→ sekya:erase的内部动作,说不定会变整个array都变掉。 59.104.35.123 07/01
5F:→ sekya:增删各元素的时候,理论上iterator都要重取才对。 59.104.35.123 07/01
6F:推 khoguan:map/set 和 vector/deque 不同220.130.208.168 07/01
7F:推 khoguan:请再看一下 8223 篇220.130.208.168 07/01







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP