考慮以下程式碼:
for (std::list<item*>::iterator i = items.begin(); i != items.end(); i++) { bool isActive = (*i)->update(); // if (!isActive) items.remove(*i); // else other_code_involving(*i); } items.remove_if(CheckItemNotActive);
目標是在更新不活動項目後立即將其從清單中刪除,從而避免第二次傳遞。但是,嘗試使用註解掉的行刪除循環中的元素會導致錯誤「列表迭代器不可遞增」。
在迭代期間安全刪除元素的關鍵是遵循正確的操作順序。程式碼應修改為while 循環,而不是上面顯示的for 循環方法,如下所示:
std::list<item*>::iterator i = items.begin(); while (i != items.end()) { bool isActive = (*i)->update(); if (!isActive) { items.erase(i++); // alternatively, i = items.erase(i); } else { other_code_involving(*i); ++i; } }
透過先遞增迭代器(i ),迭代器保持有效並可用於刪除非活動元素。
在原始 for 迴圈中,嘗試使用 items.remove(*i) 刪除元素循環體使迭代器(i)無效,導致後續迭代失敗。 while 迴圈可確保迭代器在元素被刪除之前更新,從而確保其對於後續迭代的有效性。透過使用 items.erase(i ) 或 i = items.erase(i),從清單中刪除適當的元素,且迭代器會自動更新以指向下一個有效元素。
這種方法允許用於在迭代期間有效刪除不活動的項目,而不需要單獨遍歷清單。
以上是如何在迭代時安全地從 std::list 中刪除元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!