¿Cómo puedo hacer que std :: find_if y std :: map funcionen juntos usando alguna biblioteca de impulso?
Esta pregunta está inspirada enotro tem que plantea esta pregunta:
Busque el primer valor mayor que el valor especificado por el usuario desde un contenedor de mapas
que se puede resolver de varias maneras. Una solución típica de C ++ 03 define una función dedicada (o functor) y la pasa astd::find_if
como tercer argumento.
En C ++ 11, se puede evitar definir unadedicad function (o functor), y en su lugar puede utilizarlambda
como
auto it = std:: find_if(m.begin(), mp.end(),
[n](const std::pair<std::string, int> & x) -> bool
{ return x.second > n; }
);
cual esla respuesta aceptada.
Todavía estoy buscando una solución corta y genial. Si se tratara de un vector, entonces aprendí una solución genial que utilizaBoost.Phoenix
y la solución se vuelve muy concisa ideone demo):
std::vector<int> v = ...;
auto it = std::find_if(v.begin(), v.end(), arg1 > 4);
Aquíarg1
es un objeto functor definido enboost::phoenix::arg_names
espacio de nombres y la expresiónarg1>4
evalúa a otro functor que luego pasa astd::find_if
.
Una prueba rápida es 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
Mi pregunta es, quiero resolver el problema del mapa, de manera similar. ¿Existe alguna solución? Algo como
auto it = std::find_if(m.begin(),mp.end(), (???).second > n); //m is std::map
O
auto it = std::find_if(m.begin(),mp.end(), at<1>(arg1) > n); //m is std::map
Para que funcione, la expresiónat<1>(arg1) > 2
tiene que evaluar a un functor que tomaconst std::pair &
como argumento. Mis instintos me dicen que el impulso tiene esta solución. : -)