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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
spyphy
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 35
#1

stl::list erase() - C++

26.03.2013, 13:11. Просмотров 1636. Ответов 2
Метки нет (Все метки)

вот такой код есть, но не работает. как подправить?
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()
Посмотрите здесь:

метод erase для list(STL) - C++
Всем привет! Не могу понять в чем у меня ошибка. Применяю метод erase в цикле для list, и с помощью него удаляю нужный элемент, но...

list не работает erase - C++
void in_out_Park(list&lt;Bus&gt; &amp;in, list&lt;Bus&gt; &amp;out) { int n, i=0; Bus temp; cout&lt;&lt;&quot;Введите номер автобуса: &quot;; cin&gt;&gt;n; ...

STL List - C++
Вот в чем проблема, была дана задача, решить которую надо было с помощью Deque и List, Deque надобыло оформить через STL, а List написать...

STL list - C++
как вставить элемент в середину списка list STL? float list_insert_rand(int num) { srand (time(NULL)); int rand_num, rand_pos; ...

STL list - C++
Доброго времени суток, пока имею поверхностное представление о алгоритмах STL и функциях для контейнеров, но есть задача: требуется...

List STL - C++
В общем нужно создать класс STL c помощью list: CStudent.h #include &lt;string&gt; using namespace std; enum number_type{G1, G2,...

Работа с STL list - C++
Есть некий каталог с 3 переменными (string,string,int), который нужно хранить в list Как я понимаю есть 2 решения хранения. 1....

STL List Iterator - C++
Как в STL list из итератора получить номер элемента, на который он указывает? Вот пример с вектором: cliext::vector&lt;int&gt;::iterator it; ...

STL>>list<_Ty> - C++
Подскажите, пожалуйста. Я сейчас пытаюсь вникнуть в суть контейнеров, их свойства и функции. Так вот, создал я двун. список с помощью list,...

STL vector,list - C++
У меня 2 вопроса: 1) можете рассказать,как подробно работает reverse_iterator?Создал вектор,хочу его распечатать в обратном порядке...

Удаление list STL - C++
Из списка, содержащего 100 тыс. элементов, удалить все элементы путем многократного удаления элемента из случайной позиции. Случайная...

Программа с List из STL - C++
Здравствуйте ребята. Прошу помочь мне с моим кодом. ошибок вроде нету, но не работает удаление по дате и поиск файла с наибольшим...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3145 / 1947 / 214
Регистрация: 13.01.2012
Сообщений: 7,438
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++;
    }
Да, вроде сойдет такое. Спасибо.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru