[問題] Vector 刪除元素erase+remove?

看板C_and_CPP (C/C++)作者 (Terry)時間14年前 (2011/10/15 19:38), 編輯推噓2(2058)
留言60則, 7人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) vc++ 2008 問題(Question): 請教各位前輩們,我有一個簡單的code,例如: int main() { vector<double> vector1; vector1.push_back(20); vector1.push_back(30); vector1.push_back(40); vector1.push_back(50); for(int idx=0;idx<vector1.size();idx++) { if(idx==1) { //想要刪除第一個元素 //vector1.erase(idx) //error } } 我想要刪除第一個元素,利用的是erase()這個東西 我查文章,是說這可以指定某個元素刪除,可是我想刪第一個,應該要怎麼刪除呢? 我的迴圈沒有使用.begin()和.end(),是我刪除這個元素失敗的原因嗎? 我查過一些erase()的文章,似乎都是用iterator寫的.. 然後,在找資料的中途發現,好像有人說,erase(remove( ))這種寫法比較好 不過我還沒找到真的原因,不知道是否是這樣子呢? 最後有個小觀念想詢問一下 如果vector中現在有5個元素,分別是,1、2、3、4、5 在vector中的位置分別是0、1、2、3、4 假設我把元素1刪除了,2、3、4、5元素的位置會遞補成0、1、2 、3嗎? 謝謝幫忙。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.34.100.113

10/15 19:59, , 1F
看了C++Reference 發現vector.erase(iterator positio)
10/15 19:59, 1F

10/15 19:59, , 2F
他吃的是虛擬指標,不是整數
10/15 19:59, 2F

10/15 20:01, , 3F
那我只好改了....謝謝幫忙
10/15 20:01, 3F

10/15 20:08, , 4F
詢問一下,那如果不用iterator的話,還有其它辦法可以
10/15 20:08, 4F

10/15 20:08, , 5F
刪除嗎?因為程式真的太長了...謝謝幫忙
10/15 20:08, 5F

10/15 20:21, , 6F
我看程式我還是盡量改好了....不然沒辦法..
10/15 20:21, 6F

10/15 20:21, , 7F
其它的小問題,再麻煩前輩們幫忙了,謝謝
10/15 20:21, 7F

10/15 21:38, , 8F
vector1.earse(vector1.begin)就好了, 不用for loop
10/15 21:38, 8F

10/15 21:39, , 9F
這跟程式長短有啥關連?
10/15 21:39, 9F

10/15 21:43, , 10F
因為我以為全部的for loop都要改iterator...
10/15 21:43, 10F

10/15 21:43, , 11F
我的程式很長...但是之後我有加一小段iterator去處理
10/15 21:43, 11F

10/15 21:44, , 12F
但是還沒有解決..我試試看你的方法,謝謝您
10/15 21:44, 12F

10/15 21:45, , 13F
對了,請教一下,那如果我要刪除特定的元素呢?
10/15 21:45, 13F

10/15 21:45, , 14F
也就是說可能是第二個、第三個之類的,有辦法用指定的嗎
10/15 21:45, 14F

10/15 21:45, , 15F
謝謝您
10/15 21:45, 15F

10/15 22:04, , 16F
vector1.earse(vector1.begin + n) 這樣就是刪第n個
10/15 22:04, 16F

10/15 22:06, , 17F
我來試試,謝謝您的幫忙
10/15 22:06, 17F

10/16 00:07, , 18F
如果只用earse()刪除好像會有問題?!我再試試...
10/16 00:07, 18F

10/16 08:43, , 19F
你不要老是說「有問題」,要把你的問題具體說出來
10/16 08:43, 19F

10/16 09:39, , 20F
抱歉...因為我加earse()這一段compiler可以
10/16 09:39, 20F

10/16 09:39, , 21F
可以程式碼在跑到這一行的時後就當掉了
10/16 09:39, 21F

10/16 09:40, , 22F
但是我不確定是不是我刪掉這個元素的關係
10/16 09:40, 22F

10/16 09:43, , 23F
我查過文章
10/16 09:43, 23F

10/16 09:43, , 24F
10/16 09:43, 24F

10/16 09:44, , 25F
好像是說要earse(remove())一起用才不會出錯?
10/16 09:44, 25F

10/16 09:44, , 26F
但是我還不確定...是不是這樣子的關係
10/16 09:44, 26F

10/16 09:45, , 27F
然後這earse(remove( ))語法我還不熟,不知道怎樣
10/16 09:45, 27F

10/16 09:46, , 28F
才可以刪除指定的元素..不好意思,謝謝幫忙
10/16 09:46, 28F

10/16 09:56, , 29F
我剛試了幾次,我刪了元素
10/16 09:56, 29F

10/16 09:56, , 30F
然後在去讀vector, 這在compile的時後會過
10/16 09:56, 30F

10/16 09:56, , 31F
但是執行的時後就當了.
10/16 09:56, 31F

10/16 09:58, , 32F
不好意思,麻煩了,謝謝幫忙
10/16 09:58, 32F

10/16 10:05, , 33F
http://codepad.org/FiHKEucR 這樣看起來沒啥問題
10/16 10:05, 33F

10/16 10:19, , 34F
我研究一下好了,不知道有沒有其它的東西動到vector
10/16 10:19, 34F

10/16 10:19, , 35F
然後error...
10/16 10:19, 35F

10/16 10:19, , 36F
因為我只要不加earse()就是正常的說...
10/16 10:19, 36F

10/16 10:19, , 37F
謝謝了
10/16 10:19, 37F

10/16 16:44, , 38F
erase會移除掉元素,造成你的原先的iterator出錯
10/16 16:44, 38F

10/16 16:44, , 39F
erase()會回傳他移除掉元素的下一個元素
10/16 16:44, 39F

10/16 16:45, , 40F
記得用iterator去接它
10/16 16:45, 40F

10/16 16:46, , 41F
你在iterator++的迴圈內用erase刪除掉某個元素
10/16 16:46, 41F

10/16 16:46, , 42F
iterator指的東西就會不見 這時候++應該是要會出錯的
10/16 16:46, 42F

10/16 17:01, , 43F
請教一下,該如何用iterator接呢?
10/16 17:01, 43F

10/16 17:02, , 44F
我完全懂您的意思,可是iterator不是只會++嗎?
10/16 17:02, 44F

10/16 17:02, , 45F
謝謝您的幫忙
10/16 17:02, 45F

10/16 19:04, , 46F
iter = erase(iter);這樣吧!?
10/16 19:04, 46F

10/16 19:10, , 47F
虛擬指標 = __ =
10/16 19:10, 47F

10/16 19:13, , 48F
所以就只是erase( )裡面放虛擬指標就行了嚕?感謝
10/16 19:13, 48F

10/16 19:14, , 49F
我越看越不懂你的問題是什麼了...
10/16 19:14, 49F

10/16 19:14, , 50F
而且iterator叫做虛擬指標...好怪的翻譯
10/16 19:14, 50F

10/16 19:17, , 51F
抱歉..把我的問題弄得好複雜@@
10/16 19:17, 51F

10/16 19:17, , 52F
我的問題只是說,是不是erase(remove())這樣子才會正確?
10/16 19:17, 52F

10/16 19:17, , 53F
因為我的程式只要加入erase()就會error
10/16 19:17, 53F

10/16 19:18, , 54F
然後現在是討論到說,erase(iter)裡面要用這個才會正確
10/16 19:18, 54F

10/16 19:19, , 55F
我目前是用erase(vector.begin()+n)正常中
10/16 19:19, 55F

10/16 19:19, , 56F
但是有時後傳回的數值會怪怪的就是了..還在看其它的原因
10/16 19:19, 56F

10/16 19:20, , 57F
真抱歉把問題弄得複雜..我先研究看看了,謝謝各位幫忙
10/16 19:20, 57F

10/16 19:20, , 58F
盡量不要用"會error" "會正確" "會怪怪的"描述你的問題..
10/16 19:20, 58F

10/16 19:22, , 59F
我想說推文就別說太長的字..下次我會小心,謝謝..@_@
10/16 19:22, 59F

10/16 19:26, , 60F
你可以用大寫E修改你的文章,這樣會比推文方便
10/16 19:26, 60F
文章代碼(AID): #1EcN3IeK (C_and_CPP)
文章代碼(AID): #1EcN3IeK (C_and_CPP)