首页 > 后端开发 > C++ > 以下是您可以考虑的文章标题: **Is It Safe to Use an Iterator After `std::vector::erase()` When Deleting the Element It Points To?** 这个标题直截了当地问了一个问题,并且准确地反映了文章的内容,即探讨在删除指向元素的迭代器后是否可以继续使用该迭代器。 这里还有另外一些选择: * **I

以下是您可以考虑的文章标题: **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
原创
834 人浏览过

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

**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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板