Здравствуйте, yaser, Вы писали:
Y>есть что-то типа такого
Y>typedef std::list<class_impl*> MainList;
Y>typedef std::list<MainList::iterator> SubMainCList;
Y>MainList c;
Y>SubMainCList cs;
Y>где-то в коде
Y>cnl::MainList::iterator i = c.insert(channel->consumers.begin(), impl);
Y>cs.push_back(i);
Y>еще где-то в коде
Y>for(SubMainCList::iterator it = cs.begin(); it != cs.end(); it++){
Y> if (*(*it) == this) {
Y> с.erase(*it);
Y> cs.erase(it);
Y> }
Y>Корректно ли хранить итератор? Правильно ли в такой последовательности удалять?
Согласно стандарту лперация вставки элемента в список не влияет на корректность ссылок и итераторов. То есть при выполнении вами операции
cnl::MainList::iterator i = c.insert(channel->consumers.begin(), impl);
все другие итераторы в списке остаются корректными.
Операция удаления из списка также не влияет на другие итераторы за исключением итератора, удаляемого элемента. Поэтому ваш цикл
for(SubMainCList::iterator it = cs.begin(); it != cs.end(); it++){
if (*(*it) == this) {
с.erase(*it);
cs.erase(it);
}
будет некорректным, так как вы вполняете оператор
it++ для уже ставшего некорректным итератора после удаления элемента в строке с функцией
cs.erase(it);. Об этом вы можете почитать по ссылке
http://clipper.borda.ru/?1-6-0-00000006-000-0-0-1319646235