什麼是迭代器失效
在vector
中因為插入、刪除的操作,導致vector
的空間發生改變,讓其指向的那個位置的含義已經改變(可能原位置的空間已經被釋放,也可能原位置的資料變成其原來相鄰位置上的資料),從而導致iterator
失效,因為每個容器的迭代器底層實現不同,所以導致它們失效的原因也不同,並不能因為vector
是因為插入、刪除導致的失效,就片面的認為所有的迭代器失效都是因為這個原因
哪些操作導致迭代器失效
插入、刪除
插入insert
導致的失效
iterator insert (iterator position, const value_type& val);
進行insert
操作之後,會有兩種情況
1.當前vector
的容量足夠,不需要擴容,只是進行資料的移動即可
ege:執行insert(pos,val)
之後,pos
之前的迭代器都沒有改變,pos
位置的迭代器iterator
的*iterator
變成val
,pos
的下乙個位置的*iterator
都變成原來pos
位置上的資料,之後以此類推,這就導致這些迭代器都失效
void vtest1()
cout << endl;
auto f = find(v.begin(), v.end(), 3);
v.insert(f, 33);
//解決辦法,重新獲取一下迭代器
//it1 = v.begin();
while (it1 != v.end())
cout << endl;
}1、2的迭代器不變
f在insert之前是3的迭代器
insert之後,f變成了33的迭代器
而之後的迭代器以此類推都往後移乙個位置所以都失效了
解決辦法,在insert之後重新獲取一下迭代器
2.當前容量不足,需要進行擴容,而vector
實現擴容是先建立乙個更大的空間在將資料拷貝過去,然後釋放舊空間,但是在這個時候原來的iterator
還指向已經被釋放掉的舊空間,這就成了乙個類似野指標的現象,會出現非法訪問的現象
解決方法:在insert
之後重新獲取一下迭代器即可
void vtest2()
刪除erase
導致的失效iterator erase (iterator position);
執行erase
之後,只會有一種情況,刪除pos
位置上的資料,pos
之後的資料會向前移乙個位置,
導致pos
之前的迭代器不變,pos
及其之後位置的迭代器失效,
void vtest3()
else
++it1;
} for (auto u : v)
}
總結
在進行insert
和erase
之後迭代器失效不是不可避免的,只要在insert
和erase
操作之後重新獲取一下迭代器就可以予以避免
vector迭代器失效
c 面試題經常會背問到vector和list的區別,其中就有乙個問題就困擾我們的,面試官說vector在進行插入和刪除元素的時候迭代器會失效,list不會,那這邊由我來給大家舉個列子 include include using namespace std int main include inclu...
vector的迭代器失效
大家知道vector容器與陣列的不同之處在於,vector可以自動擴容它的容量,是乙個動態的陣列,而我們的普通陣列的容量時固定死的。當vector內元素的數量等於vector容量的時候,再向vector中插入資料,vector會自動申請一塊兒更大的記憶體空間,並將原來的資料拷貝過去,並存將新的元素插...
vector迭代器失效的處理
1 這裡先給幾個我們經常遇到的問題 vs2012編譯器 include include using namespace std int main for vector iterator it a.begin it a.end it cout 這裡再呈現乙個問題 vectora for int i 0...