迭代時從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中文網其他相關文章!