在前面對於該問題的討論中,我們都知道調用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中文網其他相關文章!