[語法] for Loop 裡做list::erase()

看板C_and_CPP作者 (楊伯)時間15年前 (2010/05/30 21:35), 編輯推噓5(505)
留言10則, 3人參與, 最新討論串1/1
我有兩片段code如下 註:下述中沒有被宣告的變數視同class成員變數。 //----------片段一------------------ list<int>::iterator itInt = m_intList.begin(); conts list<int>::iterator itListend( m_intList.end() ); for( ; itInt != itListend ; ++itInt) { if( *itInt == 0 ) { list<int>::iterator itTemp = ++itInt; m_intList.erase( --itInt ); itInt = itTemp; } } //----------片段二------------------ list<int>::iterator itInt = m_intList.begin(); conts list<int>::iterator itListend( m_intList.end() ); for( ; itInt != itListend ; ) { if( *itInt == 0 ) itInt = m_intList.erase( itInt ); else ++itInt; } 上面兩片段都是在loop裡面去做list::erase()的工作,第一段感覺 起來比較像是自己將斷掉的list再接起來確保loop可以繼續。 第二段中是用list::erase()傳回來的iterator取代 ++ itInt來確保loop 可以繼續。 我想請問各位前輩,這兩段中我個人覺得第二種是比較正確的,但我想 問問看前輩們對loop中進行list::erase()的這個動作的想法,前輩們都 怎麼做? 謝謝各位! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.117.128.56

05/30 22:59, , 1F
第二個較好,意圖清楚,也少產生1個物件及2次iterator運算
05/30 22:59, 1F

05/30 23:02, , 2F
使用迭代器操作的時候必須考慮到未來會不會改變實作的
05/30 23:02, 2F

05/30 23:03, , 3F
容器, 如果使用list, 這兩種寫法都"碰巧"可以, 所以就
05/30 23:03, 3F

05/30 23:04, , 4F
vector 來說, 第一種版本++算出來的迭代器很可能會不
05/30 23:04, 4F

05/30 23:05, , 5F
合法, 最保險的方式就是像第二種, 叫容器給你一個合法
05/30 23:05, 5F

05/30 23:05, , 6F
的迭代器, 而不要靠自己算, 未來在切換實作的容器時,
05/30 23:05, 6F

05/30 23:06, , 7F
修改的地方、遇到的bug也會比較少
05/30 23:06, 7F

05/30 23:50, , 8F
一的itInt在刪除的時候會++兩次 這樣是錯的吧?
05/30 23:50, 8F

05/31 00:43, , 9F
承上,最後一個元素是0的話會爆炸 XD
05/31 00:43, 9F

05/31 01:24, , 10F
仔細看了一下, 還真的錯 XD
05/31 01:24, 10F
文章代碼(AID): #1C0ccwbB (C_and_CPP)