首頁 >後端開發 >C++ >在迭代時從 `std::set` 中刪除元素是否安全以及如何正確執行?

在迭代時從 `std::set` 中刪除元素是否安全以及如何正確執行?

DDD
DDD原創
2024-12-11 09:47:18489瀏覽

Is Erasing Elements from a `std::set` While Iterating Safe and How to Do It Correctly?

迭代時從 std::set 移除元素:安全嗎?

迭代集合並刪除滿足特定條件的元素是C 程式設計中的常見任務。但是,迭代時擦除元素的行為可能會引起對迭代器無效的擔憂。

在提供的程式碼片段中,您迭代一組整數並擦除偶數。雖然此程式碼似乎有效,但它依賴於特定於實現的行為。 C 標準沒有明確指定在迭代集合時從集合中刪除元素時會發生什麼。

標準一致方法

為了確保可移植性和可靠性,請考慮使用標準的一致方法:

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

此方法使用後綴增量運算子it ,它通過要擦除的舊迭代器,但在返回之前將其前進以指向下一個元素。結果,循環正確迭代,且迭代器在每次擦除操作後仍然有效。

C 11 解

C 11 為set 引入了更新的擦除方法簡化了迭代時擦除元素的過程:

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

這種方法使用了擦除方法,該方法傳回一個指向被擦除元素後面的元素的迭代器(如果最後一個元素被擦除,則傳回set::end)。這透過消除使用後綴增量的需要並確保它在每次擦除操作後保持有效來簡化循環。

結論

雖然初始程式碼片段可以在對於某些實現,通常不建議依賴於特定於實現的行為。透過使用標準的一致性方法或 C 11 擦除方法,您可以確保您的程式碼在不同的編譯器和平台上正確且可移植地運作。

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

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