我們現要簡單的理解一下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;
}
}
又崩了
增容·,以及容器成員的改變都要注意一下迭代器失效,我是這麼理解的,不知道是不是理解的有點淺顯