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() 之前就完成。 --



※ 發信站: 批踢踢實業坊(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燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP