Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 30

Как правильно удалять элементы листа?

27.07.2016, 09:17. Показов 3060. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
        std::list<Bullet*> bullets;
    std::list<Bullet*>::iterator bullets_it;
 
 
    for (bullets_it = bullets.begin(); bullets_it != bullets.end(); bullets_it++) {
            if ((*bullets_it)->life == false) {
                delete * bullets_it;
                bullets_it = bullets.erase(bullets_it);
            }
        }
Как правильно удалить элемент лист? Вариант выше вызывает краш
Миниатюры
Как правильно удалять элементы листа?  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.07.2016, 09:17
Ответы с готовыми решениями:

Как правильно добавлять и удалять элементы в вектор и из него
Всем доброго времени суток. Прошу объяснить как правильно добавлять и удалять элементы в вектор и из него... Использую его для хранения...

Как правильно удалять элемент из массива?
Подскажите пожалуйста как правильно удалять элемент из динамического массива к примеру максимального? Путём смещения элементов,или просто...

Как правильно задавать массив указателей и его удалять?
Т.е., например создаю указатель: TPoint *p_Point=NULL; а если массив? TPoint *p_MassPoint; //=?; как массив обнулить не ясно ...

12
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
27.07.2016, 09:22
Лучший ответ Сообщение было отмечено dead fish как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
    for (bullets_it = bullets.begin(); bullets_it != bullets.end(); ) {
            if ((*bullets_it)->life == false) {
                delete * bullets_it;
                bullets_it = bullets.erase(bullets_it);
                //Возможно, что здесь bullets_it стал равным end 
                //и тогда bullets_it++ может привести к... ну Вы сами видите к чему
            }else{
               ++bullets_it;//Так что вынес сюда.
               //Если элемент был удален -> итератор и так "сдвинулся",
               //а если не удаляем, то двигаем дальше "руками"
            }
        }
0
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 30
27.07.2016, 09:25  [ТС]
Спасибо, как-то затупил
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.07.2016, 09:25
C++
1
2
3
4
5
6
7
8
9
for (bullets_it = bullets.begin(); bullets_it != bullets.end();)
        {
            if (!(*bullets_it)->life)
            {
                delete * bullets_it;
                bullets_it = bullets.erase(bullets_it);
            }
            else ++bullets_it;
        }
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.07.2016, 09:32
http://rextester.com/WIZ61348

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <list>
 
#ifndef OUT_TO_STREAM
    #define OUT_TO_STREAM(type_)  \
        template<class T>friend   \
        ::std::basic_ostream<T>&  \
        operator<<(::std::basic_ostream<T>& os, const type_& obj )
#endif
 
 
struct Bullet
{
    OUT_TO_STREAM(Bullet)
    {
        return os 
            << "bullet: { id = " << obj.id 
            << ", life = " << (obj.life? "true ": "false") 
            << " };";
    }
    
    size_t id;
    bool life;
};
 
 
 
 
 
 
 
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    std::list<Bullet*> bullets;
    
    for(size_t n=0;n<10;++n)
        n%2 == 0 ? 
            bullets.emplace_back(new Bullet{n, true }): 
            bullets.emplace_back(new Bullet{n, false});
 
 
    std::cout<<"--- before ---\n";    
    for(const auto& pBullet: bullets)
        std::cout << *pBullet << '\n';    
    
 
    std::cout<<"--- clean ---\n";    
 
    for (auto it = bullets.begin(); it != bullets.end(); ) 
            if ( !(*it)->life ) 
                delete *it,
                it = bullets.erase(it);
            else
                ++it;
        
    std::cout<<"--- after ---\n";    
    for(const auto& pBullet: bullets)
        std::cout << *pBullet << '\n';    
 
    for(const auto& pBullet: bullets)
        delete pBullet;    
}
0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
27.07.2016, 09:40
hoggy,
C++
1
2
3
4
5
            if ( !(*it)->life ) 
                delete *it,//с запятой краше и проще? )))
                it = bullets.erase(it);
            else
                ++it;
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.07.2016, 09:51
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
с запятой краше и проще?
не понял вопроса.
0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
27.07.2016, 09:53
Цитата Сообщение от hoggy Посмотреть сообщение
не понял вопроса.
Почему не
C++
1
2
3
4
5
if ( !(*it)->life )
{
   delete *it;
   it = bullets.erase(it);
}//...
???
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.07.2016, 10:02
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Почему не
ааа.
ну да. краше и проще.
к тому же - это мой радикальный ответ,
который ставит жирную точку в холиварном вопросе фигурных скобачег))
0
27.07.2016, 10:03

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
к тому же - это мой радикальный ответ,
Я думал в этой запятой есть сакральный смысл, а это "просто так" :)

0
 Аватар для shilko2013
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
27.07.2016, 10:05
Запятая - 1 символ, скобки и ; - 3 символа. Делаем выводы
0
27.07.2016, 10:12

Не по теме:

Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Я думал в этой запятой есть сакральный смысл, а это "просто так"
конечно есть.
очевидно жеж - провоцирую адептов фигурных скобачег забыть свои разногласия,
и объединиццо перед лицом общего противника :p

0
 Аватар для shilko2013
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
27.07.2016, 10:29
hoggy, Бросаем вызов стереотипам)))

Добавлено через 4 минуты
hoggy, Даже один такой вопрос замутил, чтобы люди поинтересовались
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.07.2016, 10:29
Помогаю со студенческими работами здесь

где размещается массив и как его правильно удалять?
У меня вопрос: в примере ниже создается объект класса Map в динамической памяти. В какой памяти тогда располагается массив m? и как его...

Как правильно удалять выбранные элементы из QListWidget?
Собственно есть QListWidget с несколькими элементами, как удалять выбранный элемент? Есть предположение, что так delete...

Как правильно удалять события
Как правильно удалять события в данном случае, ибо каждое добавленное событие сохраняется. Целесообразно ли использовать IDisposable и в...

Как правильно удалять документы
Пытался написать функцию... так и не получилось ничего нормального. Может у кого есть наработки?

Как правильно удалять компонент с формы ?
когда я удаляю button1 клавишей Delete, компонент с формы проподает но в коде остаётся её функция и объявление ... как же удалять начесто ?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru