首页 > 后端开发 > C++ > 正文

## 在 `std::vector` 中删除元素的迭代器仍然有效吗?

Linda Hamilton
发布: 2024-10-26 18:03:02
原创
328 人浏览过

## Are Iterators to Erased Elements in a `std::vector` Still Valid?

std::vector 迭代器失效:挖掘擦除后迭代器的有效性

在 C 领域,向量迭代器的复杂性和他们在删除后的行为可能会造成混乱。为了深入研究这个问题,我们将探讨一个特定的场景:

在擦除操作后验证迭代器的持久性

直接指向迭代器的有效性会出现相关问题到 std::vector 中被删除的元素。普遍的观念是指向被擦除元素之后的位置的迭代器是无效的。然而,问题仍然存在:指向被删除元素的确切位置的迭代器仍然有效吗?

分析和示例

为了阐明这个问题,请考虑以下代码片段尝试从向量中消除所有奇数整数:

<code class="cpp">vector<int> vec;

for (int i = 0; i < 100; ++i) vec.push_back(i);

vector<int>::iterator it = vec.begin();
while (it != vec.end()) {
    if (*it % 2 == 1) vec.erase(it);
    else ++it;
}</code>
登录后复制

虽然此代码可能看起来运行正常,但深入研究以确定其有效性至关重要。

回答问题

答案明确指出,不仅指向被擦除元素之后位置的迭代器无效,而且指向该元素确切位置的迭代器也无效。

但是,擦除元素会提供一个返回的迭代器,该迭代器立即指向被删除的元素之后,或者如果没有剩余元素则指向末尾。这允许无缝继续迭代。

有效消除奇数元素

值得注意的是,所提供的代码片段并不是删除奇数元素的最有效方法。一种更有效的方法涉及擦除-删除习惯用法,它利用自定义谓词来定位和识别要删除的元素。例如,我们可以定义一个名为 is_odd 的谓词,并将其与remove_if和erase一起使用:

<code class="cpp">bool is_odd(int x) { return (x % 2) == 1; }
vec.erase(remove_if(vec.begin(), vec.end(), is_odd), vec.end());</code>
登录后复制

这消除了昂贵的元素移动,将时间复杂度降低到O(n)。

以上是## 在 `std::vector` 中删除元素的迭代器仍然有效吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!