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

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

Восстановить пароль Регистрация
 
slevin_45
1 / 1 / 0
Регистрация: 17.12.2013
Сообщений: 66
16.05.2014, 22:33     Remove_if для std::list #1
Здравствуйте!
Помогите мне разобраться,пожалуйста.Перечитал кучу всего,но так и не понял ,что можно писать в аргументе метода 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 с значением итератора.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 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
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 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
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 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
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 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
1477 / 1053 / 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║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
17.05.2014, 01:45     Remove_if для std::list #12
Цитата Сообщение от slevin_45 Посмотреть сообщение
сравнивать значения list с значением итератора.
Не понял

Добавлено через 44 секунды
Цитата Сообщение от slevin_45 Посмотреть сообщение
Что я не так понимаю или делаю?
Напиши для начала что ты хочешь сделать.
DU
1477 / 1053 / 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
Еще ссылки по теме:

C++ Бинарный поиск для std::list
Static std::list C++
Реализация std::list, сложность list::size() C++

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

Или воспользуйтесь поиском по форуму:
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
Ответ Создать тему
Опции темы

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