Home > Backend Development > C++ > body text

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

Mary-Kate Olsen
Release: 2024-10-31 00:50:03
Original
747 people have browsed it

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

**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 iterator failure: in-depth analysis

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>
Copy after login

The code runs fine on my machine, but that doesn't convince me that it's valid.

Validity of iterators

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>
Copy after login

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>
Copy after login

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!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!