Home >Backend Development >C++ >Here are article titles you can consider: **Is It Safe to Use an Iterator After `std::vector::erase()` When Deleting the Element It Points To?** The title asks a straightforward question and accurately reflects the content of the article, which explores whether it is possible to continue to use an iterator pointing to an element after deleting it. Here are some other options: * **I
In the previous discussion of this issue, we all know that calling std::vector::erase will only Invalidate the iterator located after the deleted element . But after deleting an element, is the iterator at that position still valid (of course, after deletion, it doesn't point to end())?
An understanding of how vectors are implemented suggests that this iterator can definitely be used, but I'm not sure if this results in undefined behavior.
As an example, the following code removes all odd integers from a vector. Does this code cause undefined behavior?
<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>
The code runs fine on my machine, but that doesn't convince me that it's valid.
Not; all iterators at or after the iterator passed to erase will be invalidated.
However, erase returns a new iterator pointing to the element after the deleted element (or to the end if there is no such element). You can use this iterator to resume iteration.
Note that this method of removing odd elements is very inefficient: every time an element is removed, all elements after it must be shifted one position to the left in the vector (this is O(n2)). You can accomplish this task more efficiently (O(n)) using the Erase-Remove idiom. You can create an is_odd predicate:
<code class="cpp">bool is_odd(int x) { return (x % 2) == 1; }</code>
Then, you can pass it to remove_if:
<code class="cpp">vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd), vec.end());</code>
The above is the detailed content of Here are article titles you can consider: **Is It Safe to Use an Iterator After `std::vector::erase()` When Deleting the Element It Points To?** The title asks a straightforward question and accurately reflects the content of the article, which explores whether it is possible to continue to use an iterator pointing to an element after deleting it. Here are some other options: * **I. For more information, please follow other related articles on the PHP Chinese website!