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

在這個程式中,我們可以得到不同型別的結果。這裡向量的大小沒有預先定義。提供了一些值用於初始化。現在在迭代過程中,我們添加了一個值。在這種情況下,如果向量沒有空間,它將在執行時建立一個新的記憶體塊,並且所有專案都將被複制。但是迭代器將指向之前的地址。因此,它可能會產生一些失效。

讓我們看看迭代器失效的一些規則。

 
插入
刪除
調整大小
向量
所有指向插入點之前的元素的迭代器都不會受到影響,但其他迭代器將失效。如果向量的尺寸增加,則所有迭代器都將失效。
刪除點之後的所有迭代器和引用都將失效。
與插入或刪除相同。
雙端佇列
如果插入的專案不是插入到雙端佇列的末尾,則所有迭代器和引用都將失效。
如果從除末尾位置之外的任何位置刪除專案,則所有迭代器都將失效。
與插入或刪除相同。
列表
所有迭代器和引用都不會受到影響
只有那些指向將被刪除的元素的迭代器或引用才會受到影響。
與插入或刪除相同。
集合、對映、多重集合、多重對映
所有迭代器和引用都不會受到影響
只有那些指向將被刪除的元素的迭代器或引用才會受到影響。
----

更新於: 2019年7月30日

1K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.