le map
iterator vous donnera un pair
où first
est la clé int
et second
est pair
valeur de la carte, donc si vous h ad un itérateur it
, vous voudriez le minimum de toutes les valeurs it->second.first
. La fonction min_element
attend une fonction de comparaison pour son troisième argument, vous devez donc créer une fonction de comparaison qui projette second.first
de ses deux arguments.
Nous allons commencer par quelques typedefs pour rendre plus lisible le code:
typedef std::pair<short, float> val_type;
typedef std::map<int, val_type> map_type;
map_type m;
Nous allons utiliser Boost.Lambda pour ses opérateurs surchargés, ce qui nous permet d'utiliser operator<
. Boost.Bind peut lier les variables membres aussi bien que les fonctions membres, donc nous en profiterons aussi.
#include <boost/bind.hpp>
#include <boost/lambda/lambda.hpp>
using boost::bind;
// Comparison is (_1.second.first < _2.second.first)
std::cout <<
std::min_element(m.begin(), m.end(),
bind(&val_type::first, bind(&map_type::iterator::value_type::second, _1))
<
bind(&val_type::first, bind(&map_type::iterator::value_type::second, _2))
)->second.first;
Cela fonctionnera également avec boost::lambda::bind
.
Également appelé 'select1st' dans certaines bibliothèques C++. – ephemient
@ephemient: True - n'était pas au courant qu'il était déjà inclus dans le STL de SGI. Dans ce cas, je recommanderais de laisser le nom de cette façon parce que SGI supporte n'importe quelle interface de type paire, alors que celle-ci ne fonctionne qu'avec std :: pair. –