1. 程式人生 > >迭代器刪除操作寫法及解釋

迭代器刪除操作寫法及解釋

1 迭代器是什麼?

迭代器是一種典型的設計模式,與集合配套使用,其目的是隱藏集合中的內部成員,並且提供對集合成員的訪問能力。其結構如下圖所示;

Iterator Pattern

具體協作關係及實現方式,就不在此贅述了。

2 在迭代器上執行刪除操作

下面以刪除list中所有給定值的元素為例,介紹迭代器的一種常見寫法及原理解釋。

錯誤寫法:

  1. std::list<int>::iterator it = listVar.begin();  
  2. while(it != listVar.end())  
  3. {  
  4.     // 相等,則刪除當前位置並後移
  5.     if (*it == iVar)  
  6.     {  
  7.         listVar.erase(it); // 刪除當前位置
  8.         it++; // 向後移動
  9.     }  
  10.     // 不相等,則向後移動
  11.     else
  12.     {  
  13.         it++;  
  14.     }  
  15. }  
在erase之後,迭代器已變為無效,因此再執行++操作,其行為是未定義的。

正確寫法一:

  1. std::list<int>::iterator it = listVar.begin();  
  2. std::list<int>::iterator = listVar.end();  
  3. while(it != listVar.end())  
  4. {  
  5.     // 相等,則刪除當前位置並後移
  6.     if (*it == iVar)  
  7.     {  
  8.         itNext = it;  
  9.         itNext++; // 先獲取到當前位置的下一個位置
  10.         listVar.erase(it); // 刪除當前位置
  11.         it = itNext; // 將下一個位置賦值給it
  12.     }  
  13.     // 不相等,則向後移動
  14.     else
  15.     {  
  16.         it++;  
  17.     }  
  18. }  

在刪除指定位置前,此時迭代器是有效的,先獲取其下一個位置,然後刪除當前位置,最後再將下一位置賦值給當前迭代器。這個方法是可行的,但是寫法很冗餘,其實這幾步,一行就可以搞定

正確寫法二:

  1. while(it != listVar.end())  
  2. {  
  3.     // 相等,則刪除當前位置並後移
  4.     if (*it == iVar)  
  5.     {  
  6.         listVar.erase(it++); // 刪除當前位置並後移
  7.     }  
  8.     // 不相等,則向後移動
  9.     else
  10.     {  
  11.         it++;  
  12.     }  
  13. }  
這種寫法也是一種很典型的用法。

相信大家在平時寫程式碼時也都是這麼用的,但為什麼這樣寫可行,可能有些同學就說不清楚了。

首先,it++是一個函式呼叫,其呼叫的函式為迭代器的operator++()方法,該方法將迭代器自身向後移動一個位置,同時其返回當前位置。

然後,erase執行時,傳遞進來的迭代器是當前位置的拷貝的一個臨時迭代器,而it此時已經指向下一個位置了。