從std::list 迭代和刪除元素
在迭代std::list 時從std::list 中刪除元素需要仔細處理避免使迭代器無效。一個常見的誤解是假設在求值後立即刪除元素將正確增加迭代器。但是,這種方法會導致“列表迭代器不可遞增”錯誤。
了解迭代器行為
在 std::list 中,元素是連續分配的。當刪除一個元素時,後續元素會移動以填滿空出的空間。結果,最初指向被刪除元素的迭代器變得無效。遞增此迭代器將導致未定義的行為。
正確方法:先遞增,然後刪除
要在迭代時正確刪除元素,請採取下列策略:
使用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; } }
此修改後的代碼迭代列表並且:
避免使用Remove_if方法
您的原始程式碼在循環後包含一個remove_if() 呼叫。在這種情況下,通常不鼓勵使用這種方法,因為它需要額外遍歷清單。如上所示,一次迭代和刪除是一種更有效率、更簡單的解決方案。
以上是如何安全地迭代和刪除 std::list 中的元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!