Этот вопрос основан на другой теме , которая ставит этот вопрос:
Найдите первое значение, превышающее заданное пользователем значение из контейнера карты
, которое может быть решено несколькими способами. Типичное решение C ++ 03 определяет выделенную функцию (или функтор) и передает ее в std :: find_if
в качестве третьего аргумента.
В C ++ 11 можно избежать определения выделенной функции (или функтора), и вместо этого можно использовать лямбда
как:
auto it = std:: find_if(m.begin(), mp.end(),
[n](const std::pair & x) -> bool
{ return x.second > n; }
);
, то есть принятый ответ .
Я все еще ищу короткое и крутое решение. Если бы это был вектор, то я просто изучил классное решение, которое использует Boost.Phoenix
, и решение становится очень кратким ( ideone demo ):
std::vector 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 (arg1)> 2
должно оцениваться как функтор, который принимает const std :: pair &
в качестве аргумента. Инстинкт подсказывает мне, что у Boost есть это решение. : -)