我是靠谱客的博主 生动蜡烛,这篇文章主要介绍java 迭代器失效_迭代器失效问题?,现在分享给大家,希望可以做个参考。

通过「实现」来说明「行为」的合理性是本末倒置的。所以,反对所有「看 vector 的实现」、「iterator 是指针」、「存在内存的重新分配」之类的答案。

照理,assign操作应该使dval容器的所有迭代器失效。

没错,判断行为的合理性应该参考 C++ 的「理」,即标准文档。

我们可以见到这样的描述(23.3.6.2/11):template

void assign(InputIterator first, InputIterator last);

Effects:

erase(begin(), end());

insert(begin(), first, last);

即 assign() 的效果应该等同于先 erase() 全部,再 insert()。

而关于 erase(),是这样的(23.3.6.5/3):iterator erase(const_iterator first, const_iterator last);

Effects: Invalidates iterators and references at or after the point of the erase.

也就是说,erase() 会让所有 iterator 和 reference 失效。

没错,assign() 后,所有迭代器无条件失效。(不管 assign() 的元素个数大于等于还是小于原先的元素个数。)

而对一个已经失效的迭代器解除引用是未定义行为,所以,assign() 之后再访问以前的迭代器,能够正常取得原来的值也好,崩溃也要,机器爆炸也好,触发世界末日也好,都是合情合理的,不需要解释。(24.2.1/10)The effect of dereferencing an iterator that has been

invalidated is undefined

最后

以上就是生动蜡烛最近收集整理的关于java 迭代器失效_迭代器失效问题?的全部内容,更多相关java内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(117)

评论列表共有 0 条评论

立即
投稿
返回
顶部