迭代集合時,需要根據條件刪除某些元素特定標準。雖然假設刪除元素會使迭代器無效似乎是合乎邏輯的,但這種行為是依賴實現的。
標準 23.1.2.8 規定「插入成員不應影響迭代器和對迭代器的引用的有效性」容器,並且擦除成員應僅使迭代器和對已擦除元素的引用無效。 」基於此,不能假設在迭代時刪除元素總是會使迭代器無效。
一種方法是在刪除元素後使用後綴增量運算符it。這會將舊位置傳遞給擦除函數,同時將迭代器指向新位置:
for (auto it = numbers.begin(); it != numbers.end(); ) { if (*it % 2 == 0) { numbers.erase(it++); } else { ++it; } }
另一種方法涉及複製當前迭代器並稍後遞增它:
while (it != numbers.end()) { // Copy the current iterator and increment it std::set<int>::iterator current = it++; int n = *current; if (n % 2 == 0) { // Don't invalidate iterator it, as it points to the next element numbers.erase(current); } }
C 11 透過擦除函數將迭代器傳回到最後刪除的元素之後的元素來簡化此過程:
for (auto it = numbers.begin(); it != numbers.end(); ) { if (*it % 2 == 0) { it = numbers.erase(it); } else { ++it; } }
以上是如何在迭代時安全地從 `std::set` 中刪除元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!