在C 中迭代映射時,必須考慮以下含義:在循環內對地圖元素呼叫擦除()方法。具體來說,出現了這樣的問題:擦除元素並繼續迭代是否安全,或者是否有必要將密鑰收集到另一個容器中並執行單獨的循環進行擦除?
在 C 03 中,從 a 中擦除元素map 不會使任何迭代器 失效,除了 那些指向已刪除元素的迭代器。但是,請務必注意,您的程式碼在呼叫擦除後正在修改迭代器。這是有問題的,因為一旦呼叫擦除,pm_it 就會變得無效。為了解決這個問題,您應該在呼叫擦除之前增加迭代器。
map<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 iterator and post-increment } else { ++pm_it; // Can use pre-increment here for efficiency } }
在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; } }
以上是在迭代期間對 C 映射元素呼叫'erase()”是否安全?的詳細內容。更多資訊請關注PHP中文網其他相關文章!