在迭代期間從映射中刪除元素
迭代映射時,常見的方法是使用基於範圍的 for 循環。但是,在迭代時修改映射可能會導致意外行為,因為迭代器將變得無效。
在迭代時從映射中刪除元素的建議技術稱為「關聯容器擦除習慣用法」:
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 循環非常重要,因為修改容器將使基於範圍的循環的迭代器無效。
在C 11 之前,在迭代映射時需要使用單獨的迭代器類型來刪除元素:
for (std::map<K, V>::iterator it = m.begin(); it != m.end(); ) { /* ... */ }
在這兩個版本中在這種情況下,刪除元素不會違反元素的常數性,因為C 中的常數性不會影響物件的生命週期。
以上是如何在迭代過程中安全地從 C 映射中刪除元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!