This question is inspired by another topic that poses this question:
Find the first value that exceeds the value specified by the user from the map container
which can be solved in several ways. A typical C ++ 03 solution defines a special function (or functor) and passes it to std::find_if as the third argument.
In C ++ 11, you can avoid defining a highlighted function (or functor) and use lambda instead as:
auto it = std:: find_if(m.begin(), mp.end(), [n](const std::pair<std::string, int> & x) -> bool { return x.second > n; } );
which is the accepted answer .
I'm still looking for a short and cool solution. If it was a vector, then I just learned the cool solution that Boost.Phoenix uses, and the solution becomes very concise ( ideone demo )
std::vector<int> v = ...; auto it = std::find_if(v.begin(), v.end(), arg1 > 4);
Here arg1 is a functor object defined in the namespace boost::phoenix::arg_names , and the expression arg1>4 is evaluated by another functor, which is then passed to std::find_if .
Quick test: ( 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
My question is that I want to solve the problem with the card in a similar way. Is there such a solution? Sort of:
auto it = std::find_if(m.begin(),mp.end(), (???).second > n); //m is std::map
Or,
auto it = std::find_if(m.begin(),mp.end(), at<1>(arg1) > n); //m is std::map
For this to work, the expression at<1>(arg1) > 2 must be evaluated by a functor that takes const std::pair & as an argument. My gut feelings tell me boost has this solution. :-)