首頁 >後端開發 >C++ >## **`std::vector::erase`傳回的迭代器在刪除後是否指向有效元素? **

## **`std::vector::erase`傳回的迭代器在刪除後是否指向有效元素? **

Barbara Streisand
Barbara Streisand原創
2024-10-25 13:11:30368瀏覽

## **Do `std::vector::erase`-returned iterators Point to Valid Elements After Removal?**

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn