Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > идиома erase-remove_if


Автор: Nat 4.7.2012, 11:15
Не могу сообразить, как правильно написать условие 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());

Автор: borisbn 4.7.2012, 11:30
сделай функцию SelfLoop НЕ членом класса TMainForm
bool SelfLoop( const EDGE & el ) {
    return el.first_ver == el.second_ver;
}

Автор: xvr 4.7.2012, 11:32
Код

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());


Автор: cupper 11.7.2012, 08:58
а еще не помешает у наследоваться от unary_function<EDGE, bool>

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

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

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

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

Автор: borisbn 11.7.2012, 12:32
Аааа. Типа unary_function::return_type. Понятно. Спасибо.

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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)