3 回答

TA貢獻1818條經驗 獲得超3個贊
如果通過valgrind運行程序,則會看到許多讀取錯誤。換句話說,是的,迭代器是無效的,但是您在示例中很幸運(或者真的很不幸,因為您沒有看到未定義行為的負面影響)。一種解決方案是創建一個臨時迭代器,增加溫度,刪除目標迭代器,然后將目標設置為溫度。例如,重新編寫循環,如下所示:
std::set<int>::iterator it = numbers.begin();
std::set<int>::iterator tmp;
// iterate through the set and erase all even numbers
for ( ; it != numbers.end(); )
{
int n = *it;
if (n % 2 == 0)
{
tmp = it;
++tmp;
numbers.erase(it);
it = tmp;
}
else
{
++it;
}
}

TA貢獻1895條經驗 獲得超3個贊
您誤解了“不確定行為”的含義。未定義的行為并不表示“如果執行此操作,則程序將崩潰或產生意外的結果。” 這意味著“如果這樣做,程序可能會崩潰或產生意外結果”,或執行其他任何操作,具體取決于您的編譯器,操作系統,月相等。
如果某件事情執行時沒有崩潰并且表現出預期的效果,則不能證明它不是未定義的行為。它所證明的是,在特定操作系統上使用特定編譯器進行編譯后,其行為恰好符合該特定運行所觀察到的。
從集合中刪除元素會使迭代器對已刪除元素無效。使用無效的迭代器是未定義的行為。碰巧的是,觀察到的行為正是您在此特定情況下想要的;這并不意味著該代碼是正確的。
- 3 回答
- 0 關注
- 530 瀏覽
添加回答
舉報