迭代器失效

2021-09-19 07:58:14 字數 2925 閱讀 1894

迭代器是我們日常寫**時經常用到的,下面我們就定義迭代器

vector::iterator it;;

cout << sizeof(it) << endl;

迭代器可以理解為我們對其的指標的操作,這就可以把it理解為乙個指標,但是指標在32位機器上是佔4個位元組,在64位機器上佔8個位元組,「迭代器指標」不是4個也不是8個而是12個位元組。

下來我們就看看vector迭代器失效。

int main()

v.push_back(4);

for (int i = 5; i < 10; i++)

vector::iterator it;;

cout << sizeof(it) << endl;

it = v.begin();

for (it; it != v.end(); it++)

cout << endl;

it = v.begin();

for (it; it != v.end(); it++)

} it = v.begin();

for (it; it != v.end(); it++)

cout << endl;

return 0;

}

例如vector、deque都是序列式容器,由於序列式容器是組合式容器,方前乙個元素的iterator被刪除後,其後的所有元素的迭代器都會失效,這是因為vector、deque都是連續儲存的一段空間,所以當對其進行erase操作時,其後的每乙個元素都會向前移動乙個位置。

上面的**會奔潰,原因就在於迭代器失效。進行erase操作的迭代器已經失效了,失效的迭代器不能進行++操作,所以程式崩潰了。但是vector的erase操作可以返回下乙個有效的迭代器,所以我們每次講下乙個有效迭代器返回就可以順利指向後面的操作了。

修改後的**如下:

int main()

v.push_back(4);

for (int i = 5; i < 10; i++)

vector::iterator it;;

cout << sizeof(it) << endl;

it = v.begin();

for (it; it != v.end(); it++)

cout << endl;

it = v.begin();

for (it; it != v.end(); it++)

} it = v.begin();

for (it; it != v.end(); it++)

cout << endl;

return 0;

}

這段**是不會崩潰的,執行的功能是將元素4用erase操作刪除,但是結果卻是只能刪除乙個元素4,第二個刪除不了。上面提到進行erase操作後,後面的元素會自動向前移動乙個位置,就相當於iterator指標會向後移動乙個位置,在for迴圈中在++一下就會向後移動兩個位置,所以說只能刪除乙個4,要想把4刪除完可以在erase操作後增加it--就可以了,**如下:

int main()

v.push_back(4);

for (int i = 5; i < 10; i++)

vector::iterator it;;

cout << sizeof(it) << endl;

it = v.begin();

for (it; it != v.end(); it++)

cout << endl;

it = v.begin();

for (it; it != v.end(); it++)

} it = v.begin();

for (it; it != v.end(); it++)

cout << endl;

return 0;

}

這樣就會將所以的4元素刪除。

當然還可以用vector裡面的remove函式進行上面**的修改

對於關聯容器如map、set、multimap、multiset,刪除當前的iterator,僅僅會讓當前的iterator失效,只要在erase事,對當前的iterator++即可。因為map之類的容器,使用了紅黑樹來實現,插入或者刪除乙個結點不會對其他結點造成影響。

int main()

map::iterator it;

it = m.begin();

for (it; it != m.end(); it++)

cout << endl;

it = m.begin();

for (it; it != m.end(); it++) }

it = m.begin();

for (it; it != m.end(); it++)

cout << endl;

return 0;

}

在刪除了6元素之後,迭代器失效了,所以在進行++的時候奔潰。erase操作可以返回下乙個有效的迭代器,所以需要加乙個返回值就可以,或者迭代器自行++也就可以得到下乙個有效的iterator;

修改後的**如下:

int main()

map::iterator it;

it = m.begin();

for (it; it != m.end(); it++)

cout << endl;

it = m.begin();

for (it; it != m.end(); it++) }

it = m.begin();

for (it; it != m.end(); it++)

cout << endl;

return 0;

}

這樣就可以刪去元素為6的元素使得迭代器不會失效。

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

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

迭代器失效

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

迭代器失效

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