std::vector 迭代器失效:詳細解釋
std::vector 中迭代器失效的概念已被頻繁討論。澄清一下,透過 std::vector::erase 擦除向量元素會使嚴格位於已擦除元素之後的迭代器無效。
但是,位於已擦除元素的確切位置的迭代器的有效性仍然不確定。從邏輯上講,人們可能會假設該迭代器仍然有效,因為向量的底層實作通常會移動剩餘元素以填充空白空間。然而,精確的行為和未定義結果的可能性不太確定。
考慮以下範例,它說明了從向量中刪除奇數整數:
<code class="cpp">typedef std::vector<int> vectype; vectype vec; for (int i = 0; i < 100; ++i) vec.push_back(i); vectype::iterator it = vec.begin(); while (it != vec.end()) { if (*it % 2 == 1) vec.erase(it); else ++it; }</code>
雖然此程式碼似乎在實踐中執行沒有錯誤,其有效性仍然存在爭議。
答案在於擦除的行為:它確實使傳遞給擦除的迭代器處或之後的所有迭代器無效。但是,它也會立即傳回一個新的迭代器,該迭代器指向被擦除元素之後的元素,或者如果這樣的元素不存在,則會回到最後。此迭代器可用於恢復迭代。
要注意的是,上述奇數去除方法的效率很低(O(n2)),因為每次擦除都需要對所有奇數進行移位後續元素。擦除-刪除習慣提供了更有效的解決方案(O(n)):
<code class="cpp">bool is_odd(int x) { return (x % 2) == 1; } vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd), vec.end());</code>
以上是## **`std::vector::erase`傳回的迭代器在刪除後是否指向有效元素? **的詳細內容。更多資訊請關注PHP中文網其他相關文章!