以下這段話來自《C++標(biāo)準(zhǔn)程序庫》—第六章STL容器
“vector迭代器失效發(fā)生在下列兩種情況
(1)使用者在一個(gè)較小索引位置上安插和移除操作
(2)由于容量變化而引起內(nèi)存分配”
要深刻理解這段話并不容易—-
其實(shí)這里迭代器失效的兩種情況代表了兩種不同的失效含義:
1.當(dāng)在vector中的某一位置安插(v.insert())或移除(v.erase())某個(gè)元素時(shí),且當(dāng)安插操作時(shí),容器還有一定的容量(v.capacity())來容納這個(gè)元素揍障。如此一來,安插和移除操作不會(huì)因容器滿而重新分配內(nèi)存一汽。在安插和移除操作后,作用點(diǎn)位置前的元素并沒改變低滩,而操作位置后的元素向后或向前移動(dòng)一位。因此作用點(diǎn)后的各元素迭代器失效岩喷。注意此處的失效只是與安插或移位前定義的迭代器的意圖出現(xiàn)稍微偏差恕沫。例如安插之前定義了一個(gè)逆向迭代器,安插后便無法通過該迭代器遍歷所有元素(會(huì)丟掉一個(gè)元素}纱意。
2.首先婶溯,我們知道vector實(shí)際上是連續(xù)存儲(chǔ)的動(dòng)態(tài)數(shù)組,因此當(dāng)容器滿時(shí)偷霉,為了保證連續(xù)存儲(chǔ)需要重新開辟空間并將其原有數(shù)組拷貝到新空間迄委,這使得原來空間的迭代器全部失效。此處的失效會(huì)在調(diào)試時(shí)出現(xiàn)debug assertion failed錯(cuò)誤类少,這是由訪問一個(gè)野指針而引起叙身。注意vector為其分配內(nèi)存的機(jī)制為:每次當(dāng)容器滿而重新分配內(nèi)存時(shí),都會(huì)分配比所需內(nèi)存多的空間硫狞,因此信轿,大多數(shù)安插和移除元素并不會(huì)發(fā)生內(nèi)存的重新分配。這在一定程度上優(yōu)化了vector的效率残吩,避免了每次插入都進(jìn)行內(nèi)存重新分配這一耗時(shí)的操作财忽。但是,盡管如此泣侮,我們也應(yīng)堅(jiān)決杜絕使用安插操作前定義的迭代器即彪。
轉(zhuǎn)載自 https://blog.csdn.net/Gouhailiang/article/details/74279285