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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
#1

Метод remove_if STL - C++

22.08.2012, 20:31. Просмотров 1902. Ответов 18
Метки нет (Все метки)

Всем привет!

Не могу понять почему вылезает ошибка при использовании remove_if для list.

ошибка

C++
1
Error   1   error C3867: 'CableTV::HelpDeleteChannels': function call missing argument list; use '&CableTV::HelpDeleteChannels' to create a pointer to member   c:\documents and settings\304-03\мои документы\visual studio 2010\projects\examwinapi\examwinapi\examwinapi.cpp 895
Код

l
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
list < ListChannel > :: iterator iteratorchannel;
iteratorchannel = remove_if( listchannel.begin(),listchannel.end(),HelpDeleteChannels);
 
bool CableTV :: HelpDeleteChannels( ListChannel &channel)
{
    int position;
    position = SendMessage( hList1,LB_GETCURSEL,0,0 );
    wstring numberpaket;
    SendMessage( hList1,LB_GETTEXT,position,( LPARAM )numberpaket.c_str( ) );// получение номера пакета
    position =_wtoi( numberpaket.c_str(  ) );
    return true;
 
}
Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2012, 20:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Метод remove_if STL (C++):

STL и функция remove_if - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;list&gt; #include &lt;algorithm&gt; #include &lt;iterator&gt; ..... struct computer1 { ...

stl::vector, метод pop_back() - C++
Доброго времени суток! Вот такой вопрос: я создаю объект в куче: someClass *test = new someClass();

Метод STL size и инициализация списка - C++
Всем доброго вечера! Вот код#include &lt;fstream&gt; // для потоковых файловых функций #include &lt;typeinfo&gt; // для typeid() using namespace...

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

Метод ближайшего соседа через STL Algorithm - C++
Добрый день. Подскажите можно метод ближайшего соседа сделать через сортировку с функтором?

Правильное использование remove_if - C++
Написал функцию, которая удаляет из последовательности типо vector элементы меньшие её среднего значения в 2 раза. Среднее значение...

18
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,046
Записей в блоге: 17
22.08.2012, 20:51 #2
Потому что передавать надо функтур, а не метод класса ( причем всегда возвращающий true )

http://www.cplusplus.com/reference/algorithm/remove_if/
1
Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
22.08.2012, 21:00  [ТС] #3
Цитата Сообщение от Avazart Посмотреть сообщение
Потому передавать надо функтур, а не метод класса...
C++
1
This can either be a pointer to a function or an object whose class overloads operator().
Надо передавать указатель на функцию или объект, это я понял. Но я применяю list в WinApi, где работаю без объектов.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,046
Записей в блоге: 17
22.08.2012, 21:02 #4
Но я применяю list в WinApi, где работаю без объектов.
не понимаю как это влияет на суть проблемы....
1
Пaтрик
416 / 391 / 39
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
22.08.2012, 21:05 #5
Holsteng, итераторы в Вашем коде разве не объекты? Передайте указатель на функцию.
0
Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
22.08.2012, 21:08  [ТС] #6
Avazart, я Вас понял, что надо создать функцию, не метод класса и записать ее в метод remove_if, я так сделал, но все - равно вылетает ошибка, которую я писал
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,046
Записей в блоге: 17
22.08.2012, 21:10 #7
C++
1
2
3
4
5
6
7
8
bool HelpDeleteChannels(const ListChannel &channel)
{
  // ... 
    return true;
}
//-------------------------------------------------------------------------------------
list < ListChannel > :: iterator iteratorchannel;
iteratorchannel = remove_if( listchannel.begin(),listchannel.end(),HelpDeleteChannels);
0
Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
22.08.2012, 21:11  [ТС] #8
Пaтрик, не пойму как это сделать, ведь я должен указать только имя функции
0
Mиxaил
533 / 438 / 37
Регистрация: 10.12.2009
Сообщений: 1,857
22.08.2012, 21:11 #9
Нужно что-то типа такого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <algorithm>
#include <list>
 
class functor
{
   public:
      bool operator()( const int n ) const
      {
         return n % 2 == 0;
      }
};
 
int main()
{
   std::list < int > lst = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
   std::remove_if( std::begin( lst ), std::end( lst ), functor() );
   for( const auto &_x : lst )
      std::cout << _x << std::endl;
   return 0;
}
Ссылка для проверки: http://liveworkspace.org/code/ff81b81e964400d4c51cd4ae51313ce9

Добавлено через 34 секунды
или свою лямбду писать...
1
Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
22.08.2012, 21:14  [ТС] #10
Цитата Сообщение от Avazart Посмотреть сообщение
list < ListChannel > :: iterator iteratorchannel;
iteratorchannel = remove_if( listchannel.begin(),listchannel.end(),HelpDeleteChannels);
Этот код у меня находиться в методе, а убрать нельзя
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,046
Записей в блоге: 17
22.08.2012, 21:16 #11
Бросайте компилятор, код , бегите читать книги и не парьте нам мозг
1
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
22.08.2012, 21:30 #12
много вариантов, можно например в таком духе

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
#include <vector>
#include <functional>
#include <algorithm>
#include <iostream>
#include <iterator>
 
class A {
public:
  bool predicat_delete (const int value) {
    return value > 3;
  }
};
 
int main () {
  A a;
 
  std::vector<int> v;
  v.push_back (4);
  v.push_back (3);
  v.push_back (2);
  v.push_back (5);
  v.erase (std::remove_if(v.begin(),
                          v.end(),
                          std::bind1st(std::mem_fun(&A::predicat_delete), &a)), v.end());
  std::copy (v.begin(), v.end(), std::ostream_iterator<int>(std::cout, "\n"));
}
правда bind* не переваривает ссылок, что исправлено в std::bind в с++11

Добавлено через 10 минут
если оно уже встроено в другой класс, то это тоже можно ообойти

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
28
29
30
31
32
33
34
35
36
37
38
#include <vector>
#include <functional>
#include <algorithm>
#include <iostream>
#include <iterator>
 
class A {
public:
  bool predicat_delete (const int& value) { 
    return value > 3;
  } 
};
 
namespace {
  typedef bool (A::*checker)(const int&);
  struct DeleteFunctor {
    DeleteFunctor (A& _a, checker _check) : a(_a), check(_check) {}
    bool operator ()(const int& value) { return (a.*check)(value); }
  private:
    A& a;
    checker check;
  };
}
 
int main () {
  A a;
 
  std::vector<int> v;
  v.push_back (4);
  v.push_back (3);
  v.push_back (2);
  v.push_back (5);
 
  v.erase (std::remove_if(v.begin(), 
                          v.end(), 
                          DeleteFunctor(a, &A::predicat_delete)), v.end());
  std::copy (v.begin(), v.end(), std::ostream_iterator<int>(std::cout, "\n"));
}
1
Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
22.08.2012, 21:31  [ТС] #13
Написал преподу, говорит необходимо сделать метод класса, который выступает в качестве предиката статическим, попробовал, все нормально, однако проблема в другом. В предикат, ведь можно передать только один параметр, а мне необходимо получить с поля ввода число, а вызвать нестатическую функцию из статического метода нельзя.
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
22.08.2012, 21:33 #14
Holsteng, в статическую функцию можно передать указатель на объект и через него дергать методы
еще учти, что remove_if не удаляет элементы
1
Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
22.08.2012, 21:40  [ТС] #15
Спасибо! Но проблема в том что мне необходимо в предикате получить число из поля ввода, там же this не доступен, а в предикат более одного параметра нельзя передавать. Ребята проблема возникла из - за чего. Я удалял из list элементы в цикле и когда элемент оказывался последним вылетала ошибка, что невозможно инкремировать итератор.
0
22.08.2012, 21:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2012, 21:40
Привет! Вот еще темы с ответами:

Не хочет работать erase с remove_if - C++
Здравствуйте, у меня есть такой код: ships.erase(std::remove_if(ships.begin(), ships.end(), (Ship &amp; ship) { ship.isDead(); }),...

Remove_if для std::list - C++
Здравствуйте! Помогите мне разобраться,пожалуйста.Перечитал кучу всего,но так и не понял ,что можно писать в аргументе метода remove_if. ...

Возможна ли реализация max_element и remove_if с использованием priority_queue? - C++
Доброго времени суток. Возник вопрос. возможна ли реализация max_element и remove_if с использованием priority_queue?

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


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

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

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