std::vector 迭代器失效:詳細解釋
std::vector 中迭代器失效的概念經常被討論。需要澄清的是,透過 std::vector::erase 擦除向量元素會使嚴格位於已擦除元素之後的迭代器無效。
但是,位於已擦除元素的確切位置的迭代器的有效性仍然不確定。從邏輯上講,人們可能會假設該迭代器仍然有效,因為向量的底層實作通常會移動剩餘元素以填充空白空間。然而,精確的行為和未定義結果的可能性不太確定。
考慮以下範例,它說明了從向量中刪除奇數整數:
typedef std::vector vectype;
vectype vec;
for (int i = 0; i 雖然這段程式碼在實踐中執行時似乎沒有錯誤,但其有效性仍然值得商榷。
答案在於擦除的行為:它確實使迭代器處或之後的所有迭代器無效( s) 傳遞到擦除。但是,它也會立即傳回一個新的迭代器,該迭代器指向被擦除元素之後的元素,或者如果這樣的元素不存在,則會回到最後。此迭代器可用於恢復迭代。
需要注意的是,上述奇數去除方法的效率很低(O(n2)),因為每次擦除都需要對所有奇數進行移位後續元素。擦除-刪除習慣提供了更有效的解決方案(O(n)):
bool is_odd(int x) { return (x % 2) == 1; }
vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd), vec.end());
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3