当我读到使用容器的insert()或erase()方法可能使容器无效时,因此最好不要在执行insert()或erase()操作之前使用迭代器缓存容器的末尾,我是混淆了为什么只有容器的最后一个位置无效而不是第一个位置。 (书中没有告知我们不应该使用容器的begin()来缓存迭代器)。
这似乎是一个愚蠢的问题但是“无效”意味着容器中元素的地址总变化?我们怎样才能确定容器开头的地址始终如一?
答案 0 :(得分:2)
每个容器都有自己的规范,说明哪些操作使迭代器无效。规范基于预期的实现。
例如,向量上的erase()
只会使新结束的迭代器失效,因为所有erase()
都会破坏新结束之外的对象并更新向量的大小:这意味着之前的对象新结束不会被破坏,它们会保留在相同的内存位置,因此迭代器和指向这些对象的指针保持不变。
另一方面,如果新insert()
大于当前size()
,则向量上的capacity()
将导致重新分配内部缓冲区,这意味着所有对象都可能是移动,因此向量中的所有迭代器和指针都将失效,包括begin()
。