C++ 中的迭代器失效
在 C++ 中,我們有不同的容器,例如 vector、list、set、map 等。要遍歷這些容器,我們可以使用迭代器。在使用 C++ 中的迭代器時,我們應該小心。當我們使用迭代器遍歷容器時,有時可能會導致迭代器失效。如果容器的形狀或大小發生變化,我們可能會遇到此類問題。在下面的示例中,我們可以識別失效的問題。
示例程式碼
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector <int> vec{11, 55, 110, 155, 220};
for (auto it=vec.begin(); it!=vec.end(); it++)
if ((*it) == 110)
vec.push_back(89); //inserting a new value while iterating the vector
for (auto it=vec.begin();it!=vec.end();it++)
cout << (*it) << " ";
}輸出
11 55 110 155 220 89 89
在這個程式中,我們可以得到不同型別的結果。這裡向量的大小沒有預先定義。提供了一些值用於初始化。現在在迭代過程中,我們添加了一個值。在這種情況下,如果向量沒有空間,它將在執行時建立一個新的記憶體塊,並且所有專案都將被複制。但是迭代器將指向之前的地址。因此,它可能會產生一些失效。
讓我們看看迭代器失效的一些規則。
| | 插入 | 刪除 | 調整大小 |
|---|---|---|---|
| 向量 | 所有指向插入點之前的元素的迭代器都不會受到影響,但其他迭代器將失效。如果向量的尺寸增加,則所有迭代器都將失效。 | 刪除點之後的所有迭代器和引用都將失效。 | 與插入或刪除相同。 |
| 雙端佇列 | 如果插入的專案不是插入到雙端佇列的末尾,則所有迭代器和引用都將失效。 | 如果從除末尾位置之外的任何位置刪除專案,則所有迭代器都將失效。 | 與插入或刪除相同。 |
| 列表 | 所有迭代器和引用都不會受到影響 | 只有那些指向將被刪除的元素的迭代器或引用才會受到影響。 | 與插入或刪除相同。 |
| 集合、對映、多重集合、多重對映 | 所有迭代器和引用都不會受到影響 | 只有那些指向將被刪除的元素的迭代器或引用才會受到影響。 | ---- |
廣告
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP