迭代器刪除操作寫法及解釋
阿新 • • 發佈:2018-12-26
1 迭代器是什麼?
迭代器是一種典型的設計模式,與集合配套使用,其目的是隱藏集合中的內部成員,並且提供對集合成員的訪問能力。其結構如下圖所示;
具體協作關係及實現方式,就不在此贅述了。
2 在迭代器上執行刪除操作
下面以刪除list中所有給定值的元素為例,介紹迭代器的一種常見寫法及原理解釋。
錯誤寫法:
- std::list<int>::iterator it = listVar.begin();
- while(it != listVar.end())
- {
- // 相等,則刪除當前位置並後移
- if (*it == iVar)
-
{
- listVar.erase(it); // 刪除當前位置
- it++; // 向後移動
- }
- // 不相等,則向後移動
- else
- {
- it++;
- }
- }
正確寫法一:
- std::list<int>::iterator it = listVar.begin();
- std::list<int>::iterator = listVar.end();
-
while(it != listVar.end())
- {
- // 相等,則刪除當前位置並後移
- if (*it == iVar)
- {
- itNext = it;
- itNext++; // 先獲取到當前位置的下一個位置
- listVar.erase(it); // 刪除當前位置
- it = itNext; // 將下一個位置賦值給it
- }
- // 不相等,則向後移動
- else
- {
- it++;
- }
- }
在刪除指定位置前,此時迭代器是有效的,先獲取其下一個位置,然後刪除當前位置,最後再將下一位置賦值給當前迭代器。這個方法是可行的,但是寫法很冗餘,其實這幾步,一行就可以搞定
正確寫法二:
- while(it != listVar.end())
- {
- // 相等,則刪除當前位置並後移
- if (*it == iVar)
- {
- listVar.erase(it++); // 刪除當前位置並後移
- }
- // 不相等,則向後移動
- else
- {
- it++;
- }
- }
相信大家在平時寫程式碼時也都是這麼用的,但為什麼這樣寫可行,可能有些同學就說不清楚了。
首先,it++是一個函式呼叫,其呼叫的函式為迭代器的operator++()方法,該方法將迭代器自身向後移動一個位置,同時其返回當前位置。
然後,erase執行時,傳遞進來的迭代器是當前位置的拷貝的一個臨時迭代器,而it此時已經指向下一個位置了。