Ответ 1
Зависит от контейнера. например если он vector
, после изменения контейнера все итераторы могут быть аннулированы. Однако, если это a list
, итераторы, не имеющие отношения к модифицированному месту, остаются в силе.
Итераторы векторов недействительны при перераспределении памяти. Кроме того, вставка или удаление элемента в середине вектора аннулирует все итераторы, указывающие на элементы, следующие за точкой вставки или удаления. Из этого следует, что вы можете помешать итераторам вектора быть недействительными, если вы используете
reserve()
для предопределения столько памяти, сколько будет использоваться вектором, и если все вставки и удаления находятся на конце вектора. [1]Семантика аннулирования итератора для
deque
заключается в следующем.Insert
(включаяpush_front
иpush_back
) аннулирует все итераторы, ссылающиеся наdeque
.Erase
в серединеdeque
аннулирует все итераторы, ссылающиеся наdeque
.Erase
в начале или в концеdeque
(включаяpop_front
иpop_back
) делает недействительным итератор, только если он указывает на стертый элемент. [2]
list
имеют важное свойство, что вставка и сплайсинг не делают недействительными итераторы для перечисления элементов, и что даже удаление делает недействительными только итераторы, указывающие на удаляемые элементы. [3]
Map
имеет важное свойство, что вставка нового элемента в элементMap
не делает недействительными итераторы, указывающие на существующие элементы. Стирание элемента с карты также не отменяет никаких итераторов, за исключением, конечно, для итераторов, которые фактически указывают на стираемый элемент. [4] (то же самое дляset
,multiset
иmultimap
)