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 есть это решение. :-)

Ответы на вопрос(1)

Ваш ответ на вопрос