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

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

27.07.2016, 09:17. Показов 2999. Ответов 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
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru