如果從頭到尾正序遍歷刪除的話,有些符合刪除條件的元素會成為漏網之魚;
正序刪除舉例:
list<
string
> templist =
newlist
<
string
>()
;for
(int i =
0; i < templist.count; i++)}
templist.
foreach
(p =
>
);
控制台輸出結果:a,b,b,c
有兩個2沒有刪除掉;
這是因為當i=1時,滿足條件執行刪除操作,會移除第乙個b,接著第二個b會前移到第乙個b的位置,即游標1對應的是第二個b。
接著遍歷i=2,也就跳過第二個b。
用for倒序遍歷刪除,從尾到頭
list<
string
> templist =
newlist
<
string
>()
;for
(int i = templist.count-
1; i>=
0; i--)}
templist.
foreach
(p =
>
);
控制台輸出結果:a,c,
這次刪除了所有的b;
使用遞迴,每次刪除以後都從新foreach,就不存在這個問題了;
static
void
main
(string
args)
;removetest
(templist)
; templist.
foreach
(p =
>);
}static
void
removetest
(list<
string
> list)
}}
迴圈list刪除自己本身的集合
控制台輸出結果 a,b,b,c 有兩個2沒有刪除掉 這是因為當i 1時,滿足條件執行刪除操作,會移除第乙個b,接著第二個b會前移到第乙個b的位置,即游標1對應的是第二個b。接著遍歷i 2,也就跳過第二個b。list templist new list for int i templist.count...
迴圈中刪除List中的元素
remove 方法刪除元素後會立刻更新list的size,因此index也發生了變化,會導致漏掉某些元素。for int i 0 i解決方案一 在刪除某乙個元素後直接break,當然這種情況只適合刪除乙個特定元素,不適合刪除多個元素 解決方案二 index回退一位,如下 for int i 0 i刪...
關於list迴圈刪除元素,迭代器失效的問題
問題的關鍵是 在刪除元素之前,將當前迭代器儲存下來。當然,這裡僅支援list,因為list的鏈式的刪除乙個元素,前面的指標指向下乙個元素,vector和queue就不好辦了,它們或者是線性的或者是半線性半鏈式,迭代器會失效 include includeusing namespace std int...