Здравствуйте, Pavel515, Вы писали:
P>почему тогда конструкция типа
P>for(k=Keys.begin();k!=Keys.end();k++)
P>{
P>...
P> if(...)
P> {
P> Keys.erase(k);
P> continue;
P> }
P>}
P>дает исключение при первом удалении, а
После инструкции
Keys.erase(k); итератор k становится недействительным, и в конце тела цикла for инкремент выполняется на этом недействительном итераторе.
P>..., а
P>k=Keys.begin();
P>while(k!=Keys.end())
P>{
P>...
P>if(...)
P>{
P>Keys.erase(k++);
P>continue;
P>}
P>k++;
P>}
P>Нет! ?
Keys.erase(k++); в данном случае все в порядке, т.к. используется постфиксная форма operator ++, и в erase уходит копия значения итератора, а у нас остается валидный инкрементированный итератор.
P>неужели все как-то держится на "гонке сигналов" ???
Конечно нет.