首頁 > 後端開發 > C++ > 迭代時如何安全地從 std::set 中刪除元素?

迭代時如何安全地從 std::set 中刪除元素?

Patricia Arquette
發布: 2024-12-11 04:08:09
原創
858 人瀏覽過

How to Safely Remove Elements from a std::set While Iterating?

迭代時從std::set 中刪除元素

迭代集合並遇到需要根據特定條件刪除的元素時,考慮對迭代器的影響至關重要。迭代時刪除元素可能會使迭代器無效,從而導致未定義的行為。

一個常見的誤解是,在迭代時從集合中刪除元素會使迭代器無效並導致 for 迴圈中的增量有未定義的行為。然而,情況並非一定如此。元素刪除期間迭代器的行為取決於實現,並且根據 C 標準未定義。

迭代時從集合中安全刪除元素的一種方法是使用替代循環結構:

1

2

3

4

5

6

7

8

for (auto it = numbers.begin(); it != numbers.end(); ) {

    if (*it % 2 == 0) {

        it = numbers.erase(it);

    }

    else {

        ++it;

    }

}

登入後複製

在此程式碼中,迭代器按值傳遞給擦除操作,該操作傳回一個指向下一個元素的迭代器(或如果最後一個元素是集合的末尾)已刪除)。這種方法符合 C 標準,並確保迭代器保持有效。

另一個選項,雖然稍微詳細一些,是在擦除元素之前創建當前迭代器的副本:

1

2

3

4

5

6

for (auto it = numbers.begin(); it != numbers.end(); ) {

    std::set<int>::iterator current = it++;

    if (*current % 2 == 0) {

        numbers.erase(current);

    }

}

登入後複製

該解決方案將迭代器增量與可能的擦除操作分開,確保指向下一個元素的迭代器仍然存在有效。

需要注意的是,除非專門針對特定容器實現,否則擦除操作通常會使集合中的所有迭代器無效,甚至超出被刪除的元素。

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板