为什么C++在使用容器时不会使 begin() 失效

Why C++ doesn't invalidate begin() when using containers

本文关键字:begin 失效 C++ 为什么      更新时间:2023-10-16

当我读到使用容器的insert()或erase()方法可以使容器无效时,因此最好不要在执行插入()或erase()操作之前使用迭代器缓存容器的末尾,我很困惑为什么只有容器的最后一个位置无效,而不是第一个位置。(书中没有建议我们不应该缓存引用容器的begin()的迭代器)。

这似乎是一个愚蠢的问题,但"无效"并不意味着容器中元素的地址完全更改吗?我们如何确定容器开头的地址始终保持不变?

每个容器都有自己的规范,规定哪些操作会使哪些迭代器无效。规范基于预期的实现。

例如,向量上的erase()只会使超过新端点的迭代器失效,因为erase()所做的只是销毁新端以外的对象并更新向量的大小:这意味着新端之前的对象不会被销毁,并且它们保持相同的内存位置,因此迭代器和指向这些对象的指针保持不变。

另一方面,如果新size()大于当前capacity(),则向量上的insert()将导致内部缓冲区被重新分配,这意味着所有对象都可能被移动,因此所有迭代器和指向向量的指针都将失效,包括begin()