CONTAINER::iterator iter , tempIt;
for (iter = cont.begin() ; iter != cont.end() ; )
{
tempIt = iter;
++iter;
cont.erase(tempIt);
}
CONTAINER::iterator iter , tempIt;
for (iter = cont.begin() ; iter != cont.end() ; )
{
tempIt = iter;
++iter;
cont.erase(tempIt);
}
假設cont是一個CONTAINER的示例,裡面包含數個元素,那麼當CONTAINER為: 1、vector 2、list 3、map 4、deque 會導緻上面的代碼片段崩潰的CONTAINER類型是?
A. 1,4
B. 2,3
C. 1,3
D. 2,4
答案A(1, 4)
解釋:首先看看各個容器的erase(pos)實作吧:
1.vector,erase(pos),直接把pos+1到finish的資料拷貝到以pos為起點的區間上,也就是vector的長度會逐漸變短,同時iter會逐漸往後移動,直到iter == cont.end(),由于容器中end()傳回的疊代器是最後一個元素的下一個(這個地方沒有任何值),現在考慮這個狀态前一個狀态,此時要删除的點是iter, tempIt = iter, ++iter會指向此時的end(),但是執行erase(tempIt)之後,end()向前移動了!!!問題來了,此時iter空了!!!不崩潰才怪。
2.list,erase(pos),幹的事情很簡單,删除自己,前後的節點連接配接起來就完了,是以iter自增的過程不會指空,不會崩潰喽。
3.map,erase(pos),幹的事情太複雜,但是我們需要知道的資訊其實很少。該容器底層實作是RBTree,删除操作分了很多種情形來讨論的,目的是為了維持紅黑樹性質。但是我們需要知道的就是每個節點類似于list節點,都是單獨配置設定的空間,是以删除一個節點并不會對其他疊代器産生影響,對應到題目中,不會崩潰喽。
4.deque,erase(pos),與vector的erase(pos)有些類似,基于結構的不同導緻中間有些步驟不太一緻。先說說deque的結構(這個結構本身比較複雜,揀重要說吧,具體看STL源碼),它是一個雙向開口的連續線性空間,實質是分段連續的,由中控器map維持其整體連續的假象。其實題中隻要知道它是雙向開口的就夠了(可以在頭部或尾部增加、删除)。在題中有erase(pos),deque是這樣處理的:如果pos之前的元素個數比較少,那麼把start到pos-1的資料移到起始位址為start+1的區間内;否則把pos後面的資料移到起始位址為pos的區間内。在題中iter一直往後移動,總會出現後面資料比前面少的時候,這時候問題就和1一樣了,必須崩潰!