通过「实现」来说明「行为」的合理性是本末倒置的。所以,反对所有「看 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