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

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

Войти
Регистрация
Восстановить пароль
 
slevin_45
1 / 1 / 0
Регистрация: 17.12.2013
Сообщений: 66
#1

Remove_if для std::list - C++

16.05.2014, 22:33. Просмотров 1132. Ответов 13
Метки нет (Все метки)

Здравствуйте!
Помогите мне разобраться,пожалуйста.Перечитал кучу всего,но так и не понял ,что можно писать в аргументе метода remove_if.
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
#include<iostream>
#include<list>
#include<algorithm>
using namespace std;
void printlist(list<int> a)
{
    copy(a.begin(),a.end(),ostream_iterator<int>(cout," "));
}
bool check(int &k,list<int>::iterator p)
{
    return(k!=*p);
}
void main()
{
    int i;
    list<int> a;
    for(i=1;i<5;i++)
    {
        a.push_back(i);
    }
    list<int>::iterator p=a.begin();
    list<int>::iterator d=a.end();
    advance(p,1);
    advance(d,-1);
    remove_if(check);
    printlist(a);
}
Когда передавал один аргумент в check всё работало.Но с двумя уже не работает.Как быть?Что хочу сделать:сравнивать значения list с значением итератора.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2014, 22:33     Remove_if для std::list
Посмотрите здесь:

Бинарный поиск для std::list - C++
Здравствуйте. Хотел написать бинарный поиск для std::list. Пишу: //Тип coord определён выше std::list&lt;coord&gt;::iterator...

Предикат для сортировки std::list - C++
Помогите правильно составить предикат для сортировки std::list Валит ошибку WinXP, VC6 #include &quot;stdafx.h&quot; #include &lt;list&gt; ...

Есть ли аналог remove_if для соседних элементов? - C++
Задача такая. Пусть есть упорядоченный набор натуральных чисел. Пример: (15, 10, 3, 9, 7, 8, 2). Наборы элементов (15, 10) (10, 3) (3,...

Вопросы по std::list - C++
1. Как обменять в списке два его элемента? Желательно большое быстродействие :) т.е. без удалить оба а потом добавить в другом порядке,...

Static std::list - C++
Добрый день, помогите решить проблему. &quot;Каждое статическое поле должно быть проинициализировано до main() явным образом&quot; - как я помню...

Вопрос по std::list - C++
Не произойдёт ли здесь какая-нибудь ошибка после удаления элемента из списка? std::list&lt;int&gt; myList; std::list&lt;int&gt;::iterator iter; ...

Сортировка std::list - C++
Есть такой фрагмент програми. Создаю функцию для сортировки list. Вроде все правильно. В класе перегружены оператори &lt; i =. Не знаю что...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 665
Завершенные тесты: 1
16.05.2014, 22:47     Remove_if для std::list #2
Ересь у вас написана. Полнейшая.
Вот это, к примеру, что такое?
C++
1
advance
такой функции в STL нету, и у тебя тоже.
Вот, тут и пример есть: http://www.cplusplus.com/reference/algorithm/remove_if/
slevin_45
1 / 1 / 0
Регистрация: 17.12.2013
Сообщений: 66
16.05.2014, 22:57  [ТС]     Remove_if для std::list #3
advance перемещает итератор.Что в ней не так?

Добавлено через 1 минуту
и да,я ведь писал,что при передаче одной переменной всё работало.Делал точно так же как и в примере:если элемент меньше заданного числа,то удалить.

Добавлено через 4 минуты
Можно ли как-то осуществить то,что я хочу с помощью функции remove_if?
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 665
Завершенные тесты: 1
16.05.2014, 22:59     Remove_if для std::list #4
Пардон, насчет advance был неправ. Но тем не менее, все неверно. remove_if принимает итераторы на начало и конец, его предикат - ОДИН аргумент, возвращает на его основе bool. Скажите, что хотите получить - подскажу, как. Ибо по вашей check не поймешь, что она с чем сравнивает (k ведь не объявлена нигде)
slevin_45
1 / 1 / 0
Регистрация: 17.12.2013
Сообщений: 66
16.05.2014, 23:16  [ТС]     Remove_if для std::list #5
Я хочу сделать вот что:
удалить все элементы между началом и концом list'a.
Начинал делать eras'ом,но потом увидел,что там есть своя заморочка и вот попробовал через remove_if.
Моя идея:сравнивать каждый элемент с значением итератора,если true,то удалять его.
Насчёт объявления k:для меня самого это было странно.Но в случае :
....
bool check(int &k)
{
}
remove_if(check)

Добавлено через 54 секунды
Я хочу сделать вот что:
удалить все элементы между началом и концом list'a.
Начинал делать eras'ом,но потом увидел,что там есть своя заморочка и вот попробовал через remove_if.
Моя идея:сравнивать каждый элемент с значением итератора,если true,то удалять его.
Насчёт объявления k:для меня самого это было странно.Но в случае всё работало(как я понял k-элемента list`a):
....
bool check(int &k)
{
return(k<10)
}
remove_if(check)

Добавлено через 3 минуты
простите,адресом

Добавлено через 7 минут
но в своей check я сравниваю значения...оо я запутался))
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 665
Завершенные тесты: 1
16.05.2014, 23:18     Remove_if для std::list #6
Потому что во втором случае предикат объявлен правильно. Только вот remove_if у тебя без итераторов - это точно неверно.

C++
1
a.erase(remove_if(a.begin(), a.end()k/*это указывает контейнер, где удалять*/, check/*нормальная версия предиката*/), a.end());
почему так - читайте книжки, долго объяснять)
Вот вариант попроще (для списка это возможно):
C++
1
a.remove_if(check/*нормальная версия предиката*/);
slevin_45
1 / 1 / 0
Регистрация: 17.12.2013
Сообщений: 66
16.05.2014, 23:30  [ТС]     Remove_if для std::list #7
ругается на необъявленность k.Я и не знаю как её объявить.В моём примере(номер два) он каким-то образом сам понимал,что это элементы списка.А здесь..
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 665
Завершенные тесты: 1
17.05.2014, 00:15     Remove_if для std::list #8
Твой вариант check в первом посте - фуфло. Вот это - верное(смысла хоят в нем особого нету, но сама схема-правильная):
C++
1
2
3
4
bool check(int &k)
{
return(k<10)
}
Цитата Сообщение от slevin_45 Посмотреть сообщение
В моём примере(номер два) он каким-то образом сам понимал
Сначала выясни, как все работает, а потом уже используй. Я тебе даже пример кинул, там все есть.

Насчет этого:
C++
1
2
3
4
bool check(int &k,list<int>::iterator p)
{
    return(k!=*p);
}
Как ты определяешь, что какой-то пирожок не равен какому-то тапочку? Здесь ты хочешь, чтобы компьютер именно это сделал.
slevin_45
1 / 1 / 0
Регистрация: 17.12.2013
Сообщений: 66
17.05.2014, 01:16  [ТС]     Remove_if для std::list #9
Да,прочитать внимательно стоило.
Кароче предикат должен принимить ТОЛЬКО один аргумент.Я вот что подумал сделать:Просто не затрагивать мне нужный диапазон:
C++
1
2
3
4
5
6
7
bool c (int &f)
{
    return(f==f);
}
    advance(p,1);
    advance(d,-2);
    a.erase(remove_if(p,d,c),a.end());
конечно,это смешно,но мне стало интересно почему не работает
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
17.05.2014, 01:35     Remove_if для std::list #10
не работает как?
не компилируется? крашится? удаляет не то? ничего не удаляет?
вроде в а после этого должен остаться только один элемент.
slevin_45
1 / 1 / 0
Регистрация: 17.12.2013
Сообщений: 66
17.05.2014, 01:41  [ТС]     Remove_if для std::list #11
Дело в итераторе d(a.end).по сути ведь:был он за последним элементом,я перемещаю его на два,чтобы он не захватывал последний элемент.Но да,выводит только один элемент.Что я не так понимаю или делаю?
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
17.05.2014, 01:45     Remove_if для std::list #12
Цитата Сообщение от slevin_45 Посмотреть сообщение
сравнивать значения list с значением итератора.
Не понял

Добавлено через 44 секунды
Цитата Сообщение от slevin_45 Посмотреть сообщение
Что я не так понимаю или делаю?
Напиши для начала что ты хочешь сделать.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
17.05.2014, 01:47     Remove_if для std::list #13
вы удаляете из контейнера элементы от итератора, который вернул алгоритм remove_if ( а он возвращает первый), до последнего элемента контейнера a (см. последний агрумент у функции erase. вы ей отдаете a.end()); возможно вы хотели отдать туда d
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2014, 01:52     Remove_if для std::list
Еще ссылки по теме:

Std::list, ошибка LNK2019 - C++
Добрый день! // element.h class Element { public: Element(){}; ~Element(){};

std::list<T*> вызвать метод - C++
Как во время просмотра MyList вызвать метод Show() каждого обьекта? class MyVehicle { public: virtual void Show() { /* ......

Передача std::list<> в функцию - C++
Нужно передать список строк в функцию. У меня сделано так: void f(list&lt;string&gt;&amp; list1) {...} т.е. по ссылке передаю ...

Непосредственное удаление из std::list - C++
Собственно проблема вот в чем раньше, когда я создавал игру, у меня были самодельные листы типа struct List { T data; ...

Реализация std::list<>::begin() - C++
Вопрос строго для знатоков реализации STL. Каким образом реализована &quot;перегрузка&quot; у списка метода begin() только по возвращаемому...


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

Или воспользуйтесь поиском по форуму:
slevin_45
1 / 1 / 0
Регистрация: 17.12.2013
Сообщений: 66
17.05.2014, 01:52  [ТС]     Remove_if для std::list #14
Cпасибо Вам огромное!
Yandex
Объявления
17.05.2014, 01:52     Remove_if для std::list
Ответ Создать тему
Опции темы

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