從映射中迭代刪除:保留迭代器
在映射迭代中,刪除元素可能是一個棘手的操作,因為它可能會使迭代器無效。為了防止這種情況,程式設計師經常尋求保留迭代器有效性的解決方案。
此問題的標準解決方案是關聯容器擦除習慣用法:
for (auto it = m.cbegin(); it != m.cend() /* not hoisted */; /* no increment */) { if (must_delete) { m.erase(it++); // or "it = m.erase(it)" since C++11 } else { ++it; } }
至關重要的是,常規for 循環必須是這裡使用而不是基於範圍的for 循環( RBFL),因為容器正在被修改。在普通的 for 迴圈中,迭代器明確遞增,從而提供對迭代過程的控制。 RBFL 會自動迭代元素,隱藏迭代機制,並可能導致未定義的行為。
對於 C 11 之前的實現,語法略有不同:
for (std::map<K,V>::iterator it = m.begin(); it != m.end(); ) { /* ... */ }
這裡, const迭代器不能被刪除。因此,必須使用適應擦除的專用迭代器。
以上是如何在保留迭代器有效性的同時安全地從 C 映射中刪除元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!