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

时间:2015-02-04 15:35:03

标签: c++ containers invalidation

当我读到使用容器的insert()或erase()方法可能使容器无效时,因此最好不要在执行insert()或erase()操作之前使用迭代器缓存容器的末尾,我是混淆了为什么只有容器的最后一个位置无效而不是第一个位置。 (书中没有告知我们不应该使用容器的begin()来缓存迭代器)。

这似乎是一个愚蠢的问题但是“无效”意味着容器中元素的地址总变化?我们怎样才能确定容器开头的地址始终如一?

1 个答案:

答案 0 :(得分:2)

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

例如,向量上的erase()只会使新结束的迭代器失效,因为所有erase()都会破坏新结束之外的对象并更新向量的大小:这意味着之前的对象新结束不会被破坏,它们会保留在相同的内存位置,因此迭代器和指向这些对象的指针保持不变。

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