Автор Тема: Использование алгоритма remove_if  (Прочитано 556 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Midi

  • Коллежский секретарь
  • ***
  • Сообщений: 59
  • Репутация: 0
Использование алгоритма remove_if
« : °ТУгбв 11, 2009, 09:18:20 am »
Обуздываю алгоритмы STL, для начала решил заняться такой задачкой.

Есть вектор:
vector<pair<double, double> > v;

Необходимо удалить из него все элементы, значение first которых больше заданного  value.

Совершенно запутался, какой же хитрый функциональный объект нужен алгоритму remove_if, чтобы все заработало.

Оффлайн bald

  • Титулярный советник
  • ****
  • Сообщений: 135
  • Репутация: 11
  • Пол: Мужской
Re: Использование алгоритма remove_if
« Ответ #1 : °ТУгбв 11, 2009, 10:36:43 pm »
class pred
{
double a;
public:
explicit pred(double val) : a(val){}
bool operator()(const pair<double,double>&p){return p.first>a;}
};

vector<pair<double,double> >v;
unsigned k=1000;
int main()
{
for(;k>0;k--) v.push_back(pair<double,double>(random(10),0));
v.erase(remove_if(v.begin(),v.end(),pred(4)),v.end());
}

хотя в случае с pair в качестве содержимого контейнера , было бы логичнее использовать std::map
...на дворе средневековье- мракобесие и джаз...

Оффлайн Midi

  • Коллежский секретарь
  • ***
  • Сообщений: 59
  • Репутация: 0
Re: Использование алгоритма remove_if
« Ответ #2 : °ТУгбв 12, 2009, 07:33:08 pm »
Спасибо!=)
Класс vector необходим, потому как нужен доступ по индексу.

А нельзя ли сделать это без написания собственного функтора, с помощью стандартного greater, подав в него через bind2nd требуемое значение?

Пока в STL плаваю, поэтому ответа "нет" будет достаточно :yes: