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

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

Patricia Arquette
Patricia Arquette原創
2024-12-11 04:08:09851瀏覽

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

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

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

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

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

for (auto it = numbers.begin(); it != numbers.end(); ) {
    if (*it % 2 == 0) {
        it = numbers.erase(it);
    }
    else {
        ++it;
    }
}

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

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

for (auto it = numbers.begin(); it != numbers.end(); ) {
    std::set<int>::iterator current = it++;
    if (*current % 2 == 0) {
        numbers.erase(current);
    }
}

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

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

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

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