Как я могу заставить std :: find_if и std :: map работать вместе с помощью некоторой библиотеки ускорения?

Этот вопрос основан на другой теме , которая ставит этот вопрос:

Найдите первое значение, превышающее заданное пользователем значение из контейнера карты

, которое может быть решено несколькими способами. Типичное решение 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 есть это решение. : -)

6
задан Community 23 May 2017 в 11:47
поделиться