Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

16.05.2014, 22:33. Просмотров 1304. Ответов 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 с значением итератора.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2014, 22:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Remove_if для std::list (C++):

Бинарный поиск для 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; ...

Реализация std::list, сложность list::size() - C++
Часто приходилось пользоваться Listом, но сейчас столкнулся с небольшой неоднозначностью. Согласно документации, метод size() в 11...

Потокобезопасность std::map::end, std::list::end - C++
Собсна сабж, могу ли я без синхронизаций выполнять подобного рода код if (myIter != map.end()) // != list.end() {...} myIter =...

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

Разъясните код пжлст(выдает ошибку:cannot convert from 'class std::list<class c_bullet *,class std::allocator<class c_bullet *> >::iterator' to 'int') - C++
Есть такие строки: std::list&lt;c_bullet*&gt; Bullets; ... for(auto i = Bullets.begin(); i != Bullets.end(); /**/) В строке цикла вот...

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

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

Добавлено через 4 минуты
Можно ли как-то осуществить то,что я хочу с помощью функции remove_if?
0
monolit
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 1
16.05.2014, 22:59 #4
Пардон, насчет advance был неправ. Но тем не менее, все неверно. remove_if принимает итераторы на начало и конец, его предикат - ОДИН аргумент, возвращает на его основе bool. Скажите, что хотите получить - подскажу, как. Ибо по вашей check не поймешь, что она с чем сравнивает (k ведь не объявлена нигде)
0
slevin_45
1 / 1 / 0
Регистрация: 17.12.2013
Сообщений: 66
16.05.2014, 23:16  [ТС] #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 я сравниваю значения...оо я запутался))
0
monolit
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 1
16.05.2014, 23:18 #6
Потому что во втором случае предикат объявлен правильно. Только вот remove_if у тебя без итераторов - это точно неверно.

C++
1
a.erase(remove_if(a.begin(), a.end()k/*это указывает контейнер, где удалять*/, check/*нормальная версия предиката*/), a.end());
почему так - читайте книжки, долго объяснять)
Вот вариант попроще (для списка это возможно):
C++
1
a.remove_if(check/*нормальная версия предиката*/);
0
slevin_45
1 / 1 / 0
Регистрация: 17.12.2013
Сообщений: 66
16.05.2014, 23:30  [ТС] #7
ругается на необъявленность k.Я и не знаю как её объявить.В моём примере(номер два) он каким-то образом сам понимал,что это элементы списка.А здесь..
0
monolit
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 1
17.05.2014, 00:15 #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);
}
Как ты определяешь, что какой-то пирожок не равен какому-то тапочку? Здесь ты хочешь, чтобы компьютер именно это сделал.
0
slevin_45
1 / 1 / 0
Регистрация: 17.12.2013
Сообщений: 66
17.05.2014, 01:16  [ТС] #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());
конечно,это смешно,но мне стало интересно почему не работает
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
17.05.2014, 01:35 #10
не работает как?
не компилируется? крашится? удаляет не то? ничего не удаляет?
вроде в а после этого должен остаться только один элемент.
0
slevin_45
1 / 1 / 0
Регистрация: 17.12.2013
Сообщений: 66
17.05.2014, 01:41  [ТС] #11
Дело в итераторе d(a.end).по сути ведь:был он за последним элементом,я перемещаю его на два,чтобы он не захватывал последний элемент.Но да,выводит только один элемент.Что я не так понимаю или делаю?
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
17.05.2014, 01:45 #12
Цитата Сообщение от slevin_45 Посмотреть сообщение
сравнивать значения list с значением итератора.
Не понял

Добавлено через 44 секунды
Цитата Сообщение от slevin_45 Посмотреть сообщение
Что я не так понимаю или делаю?
Напиши для начала что ты хочешь сделать.
1
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
17.05.2014, 01:47 #13
вы удаляете из контейнера элементы от итератора, который вернул алгоритм remove_if ( а он возвращает первый), до последнего элемента контейнера a (см. последний агрумент у функции erase. вы ей отдаете a.end()); возможно вы хотели отдать туда d
1
slevin_45
1 / 1 / 0
Регистрация: 17.12.2013
Сообщений: 66
17.05.2014, 01:52  [ТС] #14
Cпасибо Вам огромное!
0
17.05.2014, 01:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2014, 01:52
Привет! Вот еще темы с ответами:

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

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++
1. Как обменять в списке два его элемента? Желательно большое быстродействие :) т.е. без удалить оба а потом добавить в другом порядке,...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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