首页  >  文章  >  后端开发  >  ## **`std::vector::erase`返回的迭代器在删除后是否指向有效元素?**

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

Barbara Streisand
Barbara Streisand原创
2024-10-25 13:11:30297浏览

## **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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn