C 迭代器 迭代器失效問題

2021-08-18 08:06:45 字數 922 閱讀 9201

問題描述:

輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於位於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。

這是劍指offer上的一道經典習題,我們首先可以想到的解決方案是:再建立乙個臨時陣列把偶數先存放起來,然後把臨時空間的資料插入到原陣列。**如下:

void reorderarray(vector&array) 

else

}it3=arrnew.begin();

it4=arrnew.end();

for(;it3!=it4;it3++)

}

其實,迭代器失效的原因有很多,比如insert(),push(),erase(),都有可能導致迭代器失效,所以每次迴圈必須對迭代器進行更新。

上邊試圖通過定義迭代器物件進行接收末尾元素迭代器,可惜忽略了erase()會導致迭代器失效。

對於此問題,如果不要求你建立額外的陣列空間,你該怎麼做?

這樣我們可以從問題的出發點進行考慮,要將奇數放在陣列前邊,偶數放在陣列後邊,並且要求原來的順序不變。那麼必須是穩定的調整才行,不能出現資料進行跳躍。不難想出冒泡是一種穩定的排序,冒泡的思想是將關鍵字較大的資料向後邊進行調整、移動。我們模擬到這道題,那我們是不是可以將關鍵字是偶數的向後調整,這樣自然前邊是奇數,後邊全為偶數,可以達到我們的目的了。在空間複雜度上,只需要定義乙個整形的臨時變數,作為資料交換的媒介即可。**如下:

void reorderarray(vector&array) }}

}

C 迭代器失效問題

迭代器失效 1 對於在記憶體中連續分布的容器 vector queue deque 插入或者刪除會使插入或者刪除點的迭代器以及之後的迭代器失效。2。對於非連續儲存的容器 list,forword list,map 插入或刪除僅僅使插入或者刪除點迭代器失效。解決方法 1 對於連續記憶體容器或者非連續記...

C 迭代器失效問題

迭代器失效問題一般是指對於stl容器來說,呼叫erase某迭代器之後,就不能再使用這個iterator了。解決方法 1 erase iter 這樣可以繼續使用該iter 2 it erase iter 這是利用erase函式的返回值,一般的erase函式都會返回乙個刪除迭代器的後繼迭代器。如果是er...

迭代器失效問題

下面材料整理自internet 著作。stl中的容器按儲存方式分為兩類,一類是按以陣列形式儲存的容器 如 vector deque 另一類是以不連續的節點形式儲存的容器 如 list set map 在使用erase方法來刪除元素時,需要注意一些問題。在使用 list set 或 map遍歷刪除某些...