迭代器的失效

2021-09-07 05:30:25 字數 1378 閱讀 9160

我們現要簡單的理解一下std裡面的迭代器,我們應該如何理解了。憑我自己最簡單淺顯目前的理解是迭代器就是提供遍歷std容器的乙個指標

在訪問vector時候迭代器就像是乙個連續的有位址的空間

假設末尾迭代器上我們在vector迭代器上刪除pos位置,那麼我們繼續向後遍歷沒有了pos這個位址後面的位址空間就無法推到了。總而言之了,我腦海當中是這麼想的。

#include #include #include int main() ;

vectorv(a, a + sizeof(a) / sizeof(int));

// 使用find查詢3所在位置的iterator

vector::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; // 此處會導致非法訪問

崩了

int main() ;

vectorv(a, a + sizeof(a) / sizeof(int));

// 實現刪除v中的所有偶數

// 下面的程式會崩潰掉,如果是偶數,erase導致it失效

// 對失效的迭代器進行++it,會導致程式崩潰

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

迭代器失效 典型的迭代器失效

首先對於vector而言,新增和刪除操作可能使容器的部分或者全部迭代器失效。那為什麼迭代器會失效呢?vector元素在記憶體中是順序儲存,試想 如果當前容器中已經存在了10個元素,現在又要新增乙個元素到容器中,但是記憶體中緊跟在這10個元素後面沒有乙個空閒空間,而vector的元素必須順序儲存一邊索...

迭代器失效

迭代器 iterator 是乙個可以對其執行類似指標的操作 如 解除引用 operator 和遞增 operator 的物件,我們可以將它理解成為乙個指標。但它又不是我們所謂普通的指標,我們可以稱之為廣義指標,你可以通過sizeof vector iterator 來檢視,所佔記憶體並不是4個位元組...

迭代器失效

對於序列式容器 如vector,deque 刪除當前的iterator會使後面所有元素的iterator都失效。這是因為vetor,deque使用了連續分配的記憶體,刪除乙個元素導致後面所有的元素會向前移動乙個位置。所以不能使用erase iter 的方式,還好erase方法可以返回下乙個有效的it...