迭代器的失效

我們現要簡單的理解一下std裏面的迭代器,我們應該如何理解了。憑我自己最簡單淺顯目前的理解是迭代器就是提供遍歷std容器的一個指針
在訪問vector時候迭代器就像是一個連續的有地址的空間
在這裏插入圖片描述
假設末尾迭代器上我們在vector迭代器上刪除pos位置,那麼我們繼續向後遍歷沒有了pos這個地址後面的地址空間就無法推到了。總而言之了,我腦海當中是這麼想的。

  • 好了,具體看一下吧,迭代器失效,我感覺耗時應該注意就好了。如果用迭代器去遍歷容器有時候真的稍不注意就出錯了,而且半天說不定還找不到,反正要注意的。
    看一些迭代器失效的場景吧
#include <iostream>
#include <algorithm>
#include <vector> 

int main() {
	int a[] = { 1, 2, 3, 4 };
	vector<int> v(a, a + sizeof(a) / sizeof(int));

	// 使用find查找3所在位置的iterator    
	vector<int>::iterator pos = find(v.begin(), v.end(), 3);

	// 刪除pos位置的數據,導致pos迭代器失效。   
	v.erase(pos);
	cout << *pos << endl; // 此處會導致非法訪問

	// 在pos位置插入數據,導致pos迭代器失效。 
	// insert會導致迭代器失效,是因爲insert可  
	// 能會導致增容,增容後pos還指向原來的空間,而原來的空間已經釋放了。   
	pos = find(v.begin(), v.end(), 3);
	v.insert(pos, 30);
	cout << *pos << endl; // 此處會導致非法訪問

	return 0;
}

在這裏插入圖片描述
崩了

int main() {
	int a[] = { 1, 2, 3, 4 };
	vector<int> v(a, a + sizeof(a) / sizeof(int));

	// 實現刪除v中的所有偶數  
	// 下面的程序會崩潰掉,如果是偶數,erase導致it失效 
	// 對失效的迭代器進行++it,會導致程序崩潰   
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		if (*it % 2 == 0)
			v.erase(it);

		++it;
	}
}

在這裏插入圖片描述
又崩了
增容·,以及容器成員的改變都要注意一下迭代器失效,我是這麼理解的,不知道是不是理解的有點淺顯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章