有關vector的迭代器失效問題

2021-09-29 14:52:43 字數 1885 閱讀 9783

什麼是迭代器失效

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)

}

總結

在進行inserterase之後迭代器失效不是不可避免的,只要在inserterase操作之後重新獲取一下迭代器就可以予以避免

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...