Удаление в порядке.
Проблема в том, что вы удаляете - и, таким образом, делаете недействительным - itr2
, но используете его для итерации цикла.
i.a.w. после первого стирания ++itr2
имеет неопределенные результаты.
Шаблон, который я использую в этой ситуации, таков:
while(itr2 != end())
{
iterator toDelete = itr2;
++itr2; // increment before erasing!
container.erase(toDelete);
}
В некоторых нестандартных имплантах STL стирание возвращает следующий итератор, поэтому вы можете сделать:
while(itr2 != end())
itr2 = container.erase();
это не переносимо.
set<A*,B>
странно, хотя - в стандартном значении B будет компаратором.