Si j'ai un vecteur de paires:
std::vector<std::pair<int, int> > vec;
Existe-t-il un moyen simple de trier la liste par ordre croissant en fonction du deuxième élément de la paire?
Je sais que je peux écrire un petit objet de fonction qui fera le travail, mais y a-t-il un moyen d'utiliser les parties existantes de la STL et std::less
de faire le travail directement?
EDIT: Je comprends que je peux écrire une fonction ou une classe distincte à passer au troisième argument à trier. La question est de savoir si je peux ou non le construire à partir de choses standard. Je voudrais vraiment quelque chose qui ressemble à:
std::sort(vec.begin(), vec.end(), std::something_magic<int, int, std::less>());
Réponses:
EDIT : en utilisant c ++ 14, la meilleure solution est très facile à écrire grâce aux lambdas qui peuvent désormais avoir des paramètres de type
auto
. C'est ma solution préférée actuelleUtilisez simplement un comparateur personnalisé (c'est un 3ème argument optionnel pour
std::sort
)Si vous utilisez un compilateur C ++ 11, vous pouvez écrire la même chose en utilisant lambdas:
EDIT : en réponse à vos modifications à votre question, voici quelques réflexions ... si vous voulez vraiment être créatif et pouvoir beaucoup réutiliser ce concept, créez simplement un modèle:
alors vous pouvez le faire aussi:
ou même
Bien que pour être honnête, tout cela est un peu exagéré, écrivez simplement la fonction à 3 lignes et en avez terminé :-P
la source
operator<
inpair<T1,T2>
. Le comparateur par défaut utilise à la fois le premier et le deuxième élément (dans le cas où les premiers sont égaux). Ici, seul le second est utilisé."is there and easy way to sort the list in increasing order based on the second element of the pair?"
Vous pouvez utiliser boost comme ceci:
Je ne connais pas de manière standard de faire cela aussi court et concis, mais vous pouvez saisir
boost::bind
tout cela composé d'en-têtes.la source
C'est assez simple, vous utilisez la fonction de tri de l'algorithme et ajoutez votre propre fonction de comparaison
Maintenant, vous devez faire la comparaison basée sur la deuxième sélection donc déclarez vous "maComparaison" comme
la source
Avec C ++ 0x, nous pouvons utiliser des fonctions lambda:
Dans cet exemple, le type de retour
bool
est implicitement déduit.Types de retour Lambda
Lorsqu'une fonction lambda a une seule instruction, et qu'il s'agit d'une instruction de retour, le compilateur peut déduire le type de retour. À partir de C ++ 11, §5.1.2 / 4:
Pour spécifier explicitement le type de retour, utilisez le formulaire
[]() -> Type { }
, comme dans:la source
if (lhs.second == 0)
?lhs.second < rhs.second
peut retournertrue
oufalse
et le compilateur peut clairement en déduirebool
. Je voulais juste démontrer le[]() -> Type { }
cas.Pour quelque chose de réutilisable:
Vous pouvez l'utiliser comme
ou
la source
Il faudrait compter sur une norme non select2nd
la source
Essayez d'échanger les éléments des paires afin de pouvoir les utiliser
std::sort()
normalement.la source