首頁 >後端開發 >C++ >如何在迭代時安全地從 std::list 中刪除元素?

如何在迭代時安全地從 std::list 中刪除元素?

DDD
DDD原創
2024-12-18 22:59:12392瀏覽

How to Safely Remove Elements from a std::list While Iterating?

在迭代過程中安全地從std::list 中刪除元素

問題

考慮以下程式碼:

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn