”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > ## **`std::vector::erase`返回的迭代器在删除后是否指向有效元素?**

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

发布于2024-11-09
浏览:271

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

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

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

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

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

typedef std::vector vectype;
vectype vec;

for (int i = 0; i 

虽然这段代码在实践中执行时似乎没有错误,但其有效性仍然值得商榷。

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

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

bool is_odd(int x) { return (x % 2) == 1; }
vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd), vec.end());
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3