這個問題面試官最喜歡問了,咱們把它解決掉,非常簡單的。
對於序列式容器(如vector,deque),序列式容器就是陣列式容器,刪除當前的iterator會使後面所有元素的iterator都失效。這是因為vetor,deque使用了連續分配的記憶體,刪除乙個元素導致後面所有的元素會向前移動乙個位置。所以不能使用erase(iter++)的方式,還好erase方法可以返回下乙個有效的iterator。
但是erase方法可以返回下乙個有效的iterator。也就是說,別光顧著刪除,記得儲存一下下乙個有效iter。
另外,這還不是所有的原因,刪除操作讓迭代器失效的另乙個原因我放在插入操作一起講了。
2.順序容器的插入操作也是會讓迭代器失效的。別只從刪除的角度理解它對後面迭代器的影響,咱們從乙個新的角度考慮。
本身呢,vector在建立的時候是會分配一段固定大小的線性位址給你,所以並不是每次你push_back都會申請記憶體,那樣的話就**了呀。當你用光了先前那段記憶體後,vector要怎麼做呢?很簡單,它會重新申請一段更長的空間,然後把舊的資料拷貝過去,再把舊的資料銷毀掉。執行刪除操作的時候也有同樣的反向操作,vector可能會自動縮小記憶體。那麼你原先的迭代器還能行麼?
這個就舒服多了,放心刪除好了,沒關係的,只是被刪除節點的迭代器會失效,對其他的不會產生影響的。
Erase導致的迭代器失效分析(C 11)
迴圈中的erase 1 對於關聯式容器,erase之後什麼也不返回,則後續的迭代器無法向下,即不能在執行 it或it 操作。需要做的是在刪除時,進行it 讓迭代器走下去就ok。2 對於序列式容器,erase之後返回的是下乙個迭代器,但會導致後續的迭代器全部失效,此時如果想要迴圈繼續,要儲存迭代器的返...
C 迭代器 迭代器失效問題
問題描述 輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於位於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。這是劍指offer上的一道經典習題,我們首先可以想到的解決方案是 再建立乙個臨時陣列把偶數先存放起來,然後把臨時空間的...
C 迭代器失效問題
迭代器失效 1 對於在記憶體中連續分布的容器 vector queue deque 插入或者刪除會使插入或者刪除點的迭代器以及之後的迭代器失效。2。對於非連續儲存的容器 list,forword list,map 插入或刪除僅僅使插入或者刪除點迭代器失效。解決方法 1 對於連續記憶體容器或者非連續記...