首頁 > 後端開發 > C++ > 主體

以下是您可以考慮的文章標題: **Is It Safe to Use an Iterator After `std::vector::erase()` When Deleting the Element It Points To?** 這個標題直截了當地問了一個問題,並且準確地反映了文章的內容,即探討在刪除指向元素的迭代器後是否可以繼續使用該迭代器。 這裡還有另外一些選擇: * **I

Mary-Kate Olsen
發布: 2024-10-31 00:50:03
原創
747 人瀏覽過

以下是您可以考虑的文章标题:

**Is It Safe to Use an Iterator After `std::vector::erase()` When Deleting the Element It Points To?** 

这个标题直截了当地问了一个问题,并且准确地反映了文章的内容,即探讨在删除指向元素的迭代器后是否可以继续使用该迭代器。 

这里还有另外一些选择:

* **Iterators and `std::vector::erase()`: A Deep Dive**
* **

std::vector 迭代器失效:深入解析

在前面對於該問題的討論中,我們都知道調用std::vector::erase 只會使位於刪除元素 的迭代器失效。但是,在刪除一個元素後,位於該位置的迭代器是否仍然有效(當然,在刪除之後,它不指向 end())?

對於向量的實現方式的理解表明,該迭代器絕對可以使用,但我不確定這是否會導致未定義的行為。

作為一個範例,以下程式碼從向量中刪除所有奇數整數。此程式碼是否會導致未定義的行為?

<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>
登入後複製

程式碼在我的機器上運作良好,但這並不能說服我它是有效的。

迭代器的有效性

;在傳遞給 erase 的迭代器處或之後的 所有迭代器都會失效

但是,erase 傳回一個新迭代器,指向被刪除元素(或如果沒有這樣的元素,則指向末尾)之後的元素。您可以使用此迭代器來恢復迭代。

請注意,這種刪除奇數元素的方法非常低效:每次刪除一個元素時,其後的所有元素都必須在向量中向左移動一位(這是O(n2))。您可以使用 Erase-Remove 慣用用法(O(n))更有效地完成這項任務。您可以建立一個 is_odd 謂詞:

<code class="cpp">bool is_odd(int x) { return (x % 2) == 1; }</code>
登入後複製

然後,可以將其傳遞給 remove_if:

<code class="cpp">vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd), vec.end());</code>
登入後複製

以上是以下是您可以考慮的文章標題: **Is It Safe to Use an Iterator After `std::vector::erase()` When Deleting the Element It Points To?** 這個標題直截了當地問了一個問題,並且準確地反映了文章的內容,即探討在刪除指向元素的迭代器後是否可以繼續使用該迭代器。 這裡還有另外一些選擇: * **I的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!