Форум программистов, компьютерный форум CyberForum.ru

stl::list erase() - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
spyphy
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 35
26.03.2013, 13:11     stl::list erase() #1
вот такой код есть, но не работает. как подправить?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    list<int> ls;
    list<int>::iterator it;
    for(int i=0; i<5; i++) 
    {
        ls.push_back(i);    
    }
 
    for(it = ls.begin(); it != ls.end(); it++) 
    {
        std::cout << *it << std::endl;  
        if (*it == 3) {
            ls.erase(it);   
        }
    }
есть простое решение как в цикле удалить нужные (ненужные) элементы списка?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2013, 13:11     stl::list erase()
Посмотрите здесь:

C++ STL vector,list
list не работает erase C++
метод erase для list(STL) C++
C++ STL List
C++ STL list
List STL C++
STL list C++
Работа с STL list + пропись List.h C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
26.03.2013, 13:23     stl::list erase() #2
никогда не вызывайте функции меняющие список во время перебора.
удалить элементы можно так
C++
1
ls.remove(1); //удалим все единицы
если элементы списка не так просты, то придется перебирать
C++
1
2
3
4
5
6
for (std::list<int>::iterator i = ls.begin(); i != ls.end(); i++)
    if (*i == 3)
    {
        ls.erase(i);
        break; //мы удалили тройку - прерываем перебор иначе мы можем попасть на исключение доступа
    }
а вот так можно перебирать если нужно удалять несколько элементов
C++
1
2
3
4
5
    for (std::list<int>::iterator i = ls.begin(); i != ls.end();)
    {
        if (*i == 3) i = ls.erase(i);
        else i++;
    }
следует иметь ввиду что если ваши элементы зависят друг от друга и вызов деструктора элемента может повлечь за собой доступ к другим элементам удалить элемент будет не так просто
spyphy
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 35
26.03.2013, 15:03  [ТС]     stl::list erase() #3
Цитата Сообщение от vxg Посмотреть сообщение
никогда не вызывайте функции меняющие список во время перебора.
ага, это я уже заметил.

Цитата Сообщение от vxg Посмотреть сообщение

C++
1
2
3
4
5
    for (std::list<int>::iterator i = ls.begin(); i != ls.end();)
    {
        if (*i == 3) i = ls.erase(i);
        else i++;
    }
Да, вроде сойдет такое. Спасибо.
Yandex
Объявления
26.03.2013, 15:03     stl::list erase()
Ответ Создать тему
Опции темы

Текущее время: 11:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru