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

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

Barbara Streisand
Barbara Streisand原創
2024-12-09 13:52:14314瀏覽

How Can I Safely Remove Elements from a C   Map During Iteration?

在迭代期間從映射中刪除元素

在C 中,在刪除元素時迭代標準庫映射可能具有挑戰性,因為使用擦除() 使迭代器無效。然而,有一個被廣泛接受的習慣用法來解決這個問題:

for(auto it = m.begin(); it != m.cend() /* not hoisted */; /* no increment */)
{
  if(must_delete)
  {
    auto next = it;
    it = m.erase(it);      // or "it = m.erase(it)" since C++11
  }
  else
  {
    ++it;
  }
}

這個習慣用法是這樣的:

  • 禁止提升:我們不提升循環條件之外的增量運算子。這很關鍵,因為即使刪除元素,提升也會導致迭代器前進,從而可能導致未定義的行為。
  • 安全遞增: 在迴圈內,僅套用增量運算子檢查該元素是否不應被刪除後。
  • 快取下一個迭代器(C 11 或後來): 當刪除一個元素時,我們在刪除之前將迭代器快取到下一個元素。這使我們能夠繼續無縫迭代,而不會破壞迭代器序列。

Pre-C 11 文法:

在 C 11之前,擦除常數迭代器需要稍微不同的語法:

for (std::map<K,V>::iterator it = m.begin(); it != m.end(); ) { /* ... */ }

常數和刪除:

從映射中刪除元素不會違反元素的常數性,類似於刪除指向常數的指標。常量主要限制修改值的能力,而不是其生命週期。

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

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