Re: STL и итераторы
От: Сыроежка  
Дата: 10.01.12 16:22
Оценка:
Здравствуйте, 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
Меня можно встретить на www.cpp.forum24.ru
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.