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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值