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

如何在 C 中迭代時安全地刪除映射元素?

DDD
DDD原創
2024-12-22 21:22:11960瀏覽

How to Safely Erase Map Elements While Iterating in C  ?

迭代期間擦除映射元素時的潛在陷阱

在C 中操作映射時,考慮迭代時擦除元素的後果至關重要他們。本問題探討了 C 03 和 C 11 的潛在問題並提供了解決方案。

C 03 注意事項

在 C 03 中,從映射中刪除元素並不會自動使映射中的所有迭代器失效。但是,它確實使指向已刪除元素的迭代器無效。要安全地迭代映射並在迭代期間擦除元素,您需要在呼叫擦除之前遞增迭代器。以下是問題中提供的程式碼的更新版本:

map<string, SerialdMsg::SerialFunction_t><string, SerialdMsg::SerialFunction_t>::iterator pm_it = port_map.begin();
while (pm_it != port_map.end()) {
    if (pm_it->second == delete_this_id) {
        port_map.erase(pm_it++);  // Use post-increment to get the updated iterator.
    } else {
        ++pm_it;  // Can use pre-increment for efficiency.
    }
}

C 11 增強

在 C 11 中,erase() 方法得到了顯著改進。現在,它會傳回一個指向映射中下一個元素的迭代器,從而可以在迭代期間安全地刪除元素,而不會導致其他迭代器無效。使用C 11 的更新代碼為:

auto pm_it = port_map.begin();
while (pm_it != port_map.end()) {
    if (pm_it->second == delete_this_id) {
        pm_it = port_map.erase(pm_it);
    } else {
        ++pm_it;
    }
}

Mark Ransom 技術

Mark Ransom 技術是C 03 中用於在迭代期間安全地圖擦除元素的另一個選項。它涉及創建一個臨時向量來儲存要擦除的元素的鍵,然後在第二個循環中擦除它們。

總之,在 C 迭代期間從映射中擦除元素時,請考慮潛在的迭代器失效並根據您使用的 C 版本使用適當的方法。請記住在刪除元素之前始終遞增迭代器,以保持一致性並避免意外行為。

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

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