ideone.com/8myyc
вопрос вдохновлендругая тема который ставит этот вопрос:
Найти первое значение больше указанного пользователем значения из контейнера карты
которая может быть решена несколькими способами. Типичное решение C ++ 03 определяет выделенную функцию (или функтор) и передает ееstd::find_if
в качестве третьего аргумента.
В C ++ 11 можно избежать определенияпреданный функция (или функтор), и вместо этого может использоватьlambda
как:
auto it = std:: find_if(m.begin(), mp.end(),
[n](const std::pair<std::string, int> & x) -> bool
{ return x.second > n; }
);
которыйпринятый ответ.
Я все еще ищу короткое и классное решение. Если бы это был вектор, то я только что узнал классное решение, которое используетBoost.Phoenix
и решение становится очень лаконичным (Ideone демо):
std::vector<int> v = ...;
auto it = std::find_if(v.begin(), v.end(), arg1 > 4);
Вотarg1
объект функтора, определенный вboost::phoenix::arg_names
пространство имен и выражениеarg1>4
оценивает другой функтор, который затем передаетсяstd::find_if
.
Быстрый тест (ideone),
std::cout<< (arg1 > 9)(v) << std::endl; //prints 0 if as v > 9 is false, else 1
//or store the functor first and then use it
const auto & f = arg1 > 9;
std::cout<< f(v) << std::endl; //prints 0 if as v > 9 is false, else 1
У меня вопрос, я хочу решить проблему с картой аналогичным образом. Есть ли такое решение? Что-то вроде:
auto it = std::find_if(m.begin(),mp.end(), (???).second > n); //m is std::map
Или же,
auto it = std::find_if(m.begin(),mp.end(), at<1>(arg1) > n); //m is std::map
Чтобы это работало, выражениеat<1>(arg1) > 2
должен оценить функтору, который принимаетconst std::pair &
в качестве аргумента. Мои интуитивные чувства говорят мне, что у Boost есть это решение. :-)