Tri personnalisé d'un vecteur de tuples
J'ai un vecteur de n-uplets comme
vector<tuple<T1, T2, T3>> v;
Je crois que lorsque le défaut de comparaison coups de pied dans tuple types, il effectue une comparaison lexicographique.
Puis-je effectuer la comparaison par l'élément-je choisir ? Par exemple, par le deuxième élément dans l'exemple ci-dessus, ou par le ième élément d'un tuple contenant m types ?
Vous en remercie d'avance.
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Il y a beaucoup de façons de le faire, celui que j'utilise se résume à la déclaration d'une comparaison personnalisée de l'objet, en fait la suivante
Il travaille pour des tuples de longueur arbitraire (en évitant les variadic templates - même si il est assez facile et plus sûr de le faire les variadic façon parce que vous pouvez déclarer les arguments de l'opérateur() n-uplets de longueur arbitraire) et aussi fonctionne pour les paires de et vous pouvez passer une comparaison personnalisée de la fonction/objet mais utilise
<
opérateur comme la politique par défaut. Un exemple d'utilisation seraitil y a bien sûr de façon plus moderne, en utilisant les lambdas, de sorte que la ligne de tri serait
Je crois qu'il vaut la peine de faire un objet de fonction (évite beaucoup de code réutilisable) et aller avec la première approche
MODIFIER
Comme Yakk commentaire (sur le c++1y) est devenu compatible avec le standard c++14), nous démontrons ci-dessous le cas pour générique lambdas
qui a grandement correspond à la mécanique de
TupleCompare
depuis leoperator()
est basé sur un modèle.Vous pouvez le faire comme ceci
Oui, vous pouvez définir des options de tri en C++ quand vous en avez besoin. Je suppose que vous en avez besoin pour
std::sort
droit? Regardez la documentation destd::sort
lors de la deuxième version de l'algorithme pour être plus précis, celui qui prend lacomp
argument.Vous devez définir un moins-que foncteur, quelque chose comme ceci:
Et ensuite l'utiliser dans
std::sort
:En C++11, vous pouvez rendre le code beaucoup plus court à l'aide d'un lambda au lieu de créer un nom de struct. Les exemples donnés au cppreference.com montrent également cette technique.
Donc, ici, est le moyen le plus simple que j'ai appris à le faire (et je pense que c'est encore plus simple que la principale réponse). Cela fonctionne sur n'importe quel type dans le tuple qui peut être comparé avec
<
.Ici est la fonction de tri
TupleLess
qui tire profit de certains C la syntaxe de style: