crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> наступил на замечательные грабли
Алексей1153
  опции профиля:
сообщение 8.12.2012, 23:12
Сообщение #1


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


из примера, думаю, понятно ))) Только у меня там хранились указатели, да не просто указатели, а на объекты, хранящиеся в QGraphicsScene. В итоге, сцена убивала объект в деструкторе, а я потом удалял из своего контейнера. Догадался о месте ошибки далеко не сразу ))))

typedef std::map<int,int> td_map;

td_map m;

m[0]=1;
m[1]=1;
m[2]=1;
m[3]=2;
m[4]=2;
m[5]=2;
m[6]=3;
m[7]=3;

//удаляем все двойки

//неправильно!
for(td_map::iterator it=m.begin();it!=m.end();it++)
{
    if(it->second==2)
    {
        m.erase(it++);
        if(it==m.end())break;
        //а в начале новой итерации пропустится один элемент!
    }
}

//ок
for(td_map::iterator it=m.begin();it!=m.end();/*it++*/)
{
    if(it->second==2)
    {
        m.erase(it++);
    }
    else
    {
        it++;
    }
}


Сообщение отредактировал Алексей1153 - 8.12.2012, 23:14
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Алексей1153
  опции профиля:
сообщение 9.12.2012, 22:43
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Iron Bug, мне ооочень редко приходится в цикле править длину контейнера, а обычно после этого я выходил из цикла. Вот по инерции и оставил шапку цикла как было обычно

теперь я для себя запомнил - правишь длину контейнера, убирай "автоинкремент". Только вручную
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 4:23