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

## **`std::vector::erase`返回的迭代器在删除后是否指向有效元素?**

Barbara Streisand
发布: 2024-10-25 13:11:30
原创
296 人浏览过

## **Do `std::vector::erase`-returned iterators Point to Valid Elements After Removal?**

std::vector 迭代器失效:详细解释

std::vector 中迭代器失效的概念已被频繁讨论。澄清一下,通过 std::vector::erase 擦除向量元素会使严格位于已擦除元素之后的迭代器无效。

但是,位于已擦除元素的确切位置的迭代器的有效性仍然不确定。从逻辑上讲,人们可能会假设该迭代器仍然有效,因为向量的底层实现通常会移动剩余元素以填充空白空间。然而,精确的行为和未定义结果的可能性不太确定。

考虑以下示例,它说明了从向量中删除奇数整数:

<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>
登录后复制

虽然此代码似乎在实践中执行没有错误,其有效性仍然存在争议。

答案在于擦除的行为:它确实使传递给擦除的迭代器处或之后的所有迭代器无效。但是,它还会立即返回一个新的迭代器,该迭代器指向被擦除元素之后的元素,或者如果这样的元素不存在,则返回到末尾。该迭代器可用于恢复迭代。

需要注意的是,上述奇数去除方法的效率很低(O(n2)),因为每次擦除都需要对所有奇数进行移位后续元素。擦除-删除习惯提供了一种更有效的解决方案(O(n)):

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

以上是## **`std::vector::erase`返回的迭代器在删除后是否指向有效元素?**的详细内容。更多信息请关注PHP中文网其他相关文章!

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