Будет ли добавление или вставка элементов лишать законной силы некоторые из них - все итераторы в контейнере, полностью зависит от типа контейнера.
Возможно, вы захотите изучить std::list
, поскольку это один из наиболее допустимых контейнеров в отношении проверки итератора. Например, при удалении элемента будут отменены только итераторы, указывающие на удаленный элемент. Все остальные итераторы остаются действительными.
Вам все еще нужно решить, какие операции являются действительными. Вы могли бы подумать о том, чтобы не разрешать прямые операции добавления / удаления в списке наблюдателей и ставить в очередь действия добавления и удаления, когда происходит уведомление, воздействуя на очередь по завершении уведомления.
Если наблюдателям разрешено удалять только себя или добавлять новых наблюдателей, это может быть излишним, и такой цикл будет достаточно безопасным:
for( std::list<Observer>::iterator i = observers.begin(); i != observers.end(); )
{
std::list<Observer>::iterator save = i++;
save->on_change();
}