Como posso fazer com que std :: find_if e std :: map funcionem juntos usando uma biblioteca de impulso?
Esta questão é inspirada emoutro assunt que coloca esta pergunta:
Encontre o primeiro valor maior que o valor especificado pelo usuário em um contêiner de mapa
que pode ser resolvido de várias maneiras. Uma solução típica do C ++ 03 define uma função dedicada (ou functor) e a passa parastd::find_if
como terceiro argumento.
No C ++ 11, pode-se evitar definir umdedicad (ou functor) e, em vez disso, pode usarlambda
Como
auto it = std:: find_if(m.begin(), mp.end(),
[n](const std::pair<std::string, int> & x) -> bool
{ return x.second > n; }
);
qual éa resposta aceita.
Ainda estou procurando uma solução curta e legal. Se fosse um vetor, acabei de aprender uma solução legal que utilizaBoost.Phoenix
e a solução se torna muito concisa ideone demo):
std::vector<int> v = ...;
auto it = std::find_if(v.begin(), v.end(), arg1 > 4);
Aquiarg1
é um objeto functor definido emboost::phoenix::arg_names
namespace e a expressãoarg1>4
avalia para outro functor que é passado parastd::find_if
.
Um teste rápido é 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
Minha pergunta é: eu quero resolver o problema do mapa, de maneira semelhante. Existe alguma solução desse tipo? Algo como
auto it = std::find_if(m.begin(),mp.end(), (???).second > n); //m is std::map
Ou
auto it = std::find_if(m.begin(),mp.end(), at<1>(arg1) > n); //m is std::map
Para que funcione, a expressãoat<1>(arg1) > 2
tem que avaliar para um functor que levaconst std::pair &
como argumento. Meus instintos me dizem que o impulso tem essa solução. : -)