Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> идиома erase-remove_if 
V
    Опции темы
Nat
Дата 4.7.2012, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 16.4.2007

Репутация: нет
Всего: нет



Не могу сообразить, как правильно написать условие SelfLoop  smile 

.h
Код


struct EDGE
    {
        int first_ver;
        int second_ver;
    };
std::vector<EDGE> edge_v;


.cpp

Код

bool TMainForm::SelfLoop(EDGE el)
{
    return(el.first_ver == el.second_ver);
}
//---------------------------------------------------------------------------

edge_v.erase(std::remove_if(edge_v.begin(),edge_v.end(),SelfLoop),edge_v.end());

PM MAIL   Вверх
borisbn
Дата 4.7.2012, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



сделай функцию SelfLoop НЕ членом класса TMainForm
bool SelfLoop( const EDGE & el ) {
    return el.first_ver == el.second_ver;
}


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
xvr
Дата 4.7.2012, 11:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Код

struct SelfLoop {
 bool operator () (EDGE& el) const
  {
    return(el.first_ver == el.second_ver);
  }
};
//---------------------------------------------------------------------------
edge_v.erase(std::remove_if(edge_v.begin(),edge_v.end(),SelfLoop()),edge_v.end());


PM MAIL   Вверх
cupper
Дата 11.7.2012, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



а еще не помешает у наследоваться от unary_function<EDGE, bool>
PM MAIL   Вверх
borisbn
Дата 11.7.2012, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(cupper @  11.7.2012,  08:58 Найти цитируемый пост)
а еще не помешает у наследоваться от unary_function<EDGE, bool>

часто видел, что так делают (в том же STL), но никогда не мог понять зачем. Не просветишь ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
xvr
Дата 11.7.2012, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(borisbn @  11.7.2012,  11:11 Найти цитируемый пост)
часто видел, что так делают (в том же STL), но никогда не мог понять зачем. Не просветишь ? 

Некоторые алгоритмы (и не только) могут использовать типы, определенные в функторе. unary_function эти типы предоставляет

PM MAIL   Вверх
borisbn
Дата 11.7.2012, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Аааа. Типа unary_function::return_type. Понятно. Спасибо.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 11.7.2012, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



borisbn, иначе стл-овские фичи не будут работать, типа: not1, not2, bind1st , bind2st  и т.д.

В данном случае можно написать, например :
Цитата

edge_v.erase(std::remove_if(edge_v.begin(),edge_v.end(),not1(SelfLoop())),edge_v.end());

без наследования от unary_function, это не скомпилится.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1368 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.