/ / prédiction de fonction lambda à utiliser pour find_if qui compare un élément de carte composé - c ++, if-statement, find, predicate

prédicat de fonction lambda à utiliser pour find_if qui compare l'élément map de type composé - c ++, if-statement, find, predicate

S'il vous plaît voir l'extrait de code suivant ci-dessous:

typedef boost::tuple<std::string, int, std::string> TUPLE;
std::map<int, TUPLE> m;

std::find_if
(
m.begin(),
m.end(),
boost::lambda::bind
(
&std::map<int, TUPLE>::value_type::second_type::head,
boost::lambda::bind
(
&std::map<int, TUPLE>::value_type::second,
boost::lambda::_1
)
)
==
"someString"
);

J'essaie de créer un prédicat pour find_if (en utilisant boost lambda) et de comparer le premier élément d'un tuple à une chaîne. Cependant, y a-t-il un moyen de faire en sorte que ce travail ressemble à quelque chose comme:

typedef boost::tuple<std::string, int, std::string> TUPLE;
std::map<int, TUPLE> m;

std::find_if
(
m.begin(),
m.end(),
boost::lambda::bind
(
&std::map<int, TUPLE>::value_type::second_type::get<0>,
boost::lambda::bind
(
&std::map<int, TUPLE>::value_type::second,
boost::lambda::_1
)
)
==
"someString"
);

J'ai changé second_type :: head en second_type :: get <0> mais cela ne compile pas. J'essaie de créer un prédicat qui compare le premier ou le deuxième élément du tuple à une chaîne.

C'est l'une des erreurs que je reçois:

Erreur 29 erreur C2780: "const boost :: lambda :: lambda_functor>, detail :: bind_tuple_mapper :: type >> boost :: lambda :: bind (const Arg1 &)": attend 1 argument - 2 fournis

Est-il possible de comparer spécifiquement le nélément du tuple? (pas seulement la tête) J'ai essayé de représenter les éléments du tuple en tant que struct et cela fonctionne, mais je vous serais reconnaissant s'il existe un moyen d'utiliser tuple.

Note latérale: je ne peux pas utiliser [](){} notation en raison de la version du compilateur.

Réponses:

2 pour la réponse № 1

Ok, je ne sais pas ce qui se passe avec boost, mais avec les lambdas C ++ 11, c’est la suivante:

typedef std::tuple<std::string, int, std::string> TUPLE;
std::map<int, TUPLE> m;

std::find_if(m.begin(), m.end(), [] (const std::pair<int, TUPLE>& v) {
return v.second.get<1>() == "someString";
});

En devinant de la documentation de boost, ce serait:

std::find_if(m.begin(), m.end(),
return boost::lambda::_1.second.second == "someString");