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

如何安全地迭代和刪除 std::list 中的元素?

Patricia Arquette
Patricia Arquette原創
2025-01-04 15:31:40491瀏覽

How to Safely Iterate and Remove Elements from a std::list?

從std::list 迭代和刪除元素

在迭代std::list 時從std::list 中刪除元素需要仔細處理避免使迭代器無效。一個常見的誤解是假設在求值後立即刪除元素將正確增加迭代器。但是,這種方法會導致“列表迭代器不可遞增”錯誤。

了解迭代器行為

在 std::list 中,元素是連續分配的。當刪除一個元素時,後續元素會移動以填滿空出的空間。結果,最初指向被刪除元素的迭代器變得無效。遞增此迭代器將導致未定義的行為。

正確方法:先遞增,然後刪除

要在迭代時正確刪除元素,請採取下列策略:

  1. 先遞增迭代器:使用i移動在刪除任何內容之前,迭代器到下一個元素。
  2. 刪除前一個元素: 使用 items.erase(i ) 刪除目前位置之前的元素,其中 i 傳回一個迭代器到下一個元素。或者,您可以使用 i = items.erase(i);達到相同的結果。

使用While 循環修改代碼:

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;
    }
}

此修改後的代碼迭代列表並且:

  1. 對每個項目呼叫update()。
  2. 如果該項目是不活動,請刪除它並將迭代器移至下一個元素。
  3. 如果該項目處於活動狀態,則執行其他程式碼並遞增迭代器。

避免使用Remove_if方法

您的原始程式碼在循環後包含一個remove_if() 呼叫。在這種情況下,通常不鼓勵使用這種方法,因為它需要額外遍歷清單。如上所示,一次迭代和刪除是一種更有效率、更簡單的解決方案。

以上是如何安全地迭代和刪除 std::list 中的元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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