J'ai un vecteur de paires de ints, à savoir Est-il possible de modifier ou de "personnaliser" les opérateurs d'une classe existante?
std::vector< std::pair<int, int> > V;
Je voulais trier ce vecteur, j'ai donc écrit une implémentation quicksort. Heureusement, std::pair définit déjà les opérateurs de comparaison intelligents tels que
[[3, 1], [1, 7], [3, 5]]
sortes de
[[1, 7], [3, 1], [3, 5]]
à-dire tri par le premier élément de chaque paire, en utilisant le second élément comme un bris d'égalité.
Mais ce que je veux réellement est de comparer le deuxième élément décroissant ordre. Ainsi, l'exemple ci-dessus doit être triée comme
[[1, 7], [3, 5], [3, 1]]
Est-il possible de passer outre les opérateurs de comparaison de std::pair
afin que je puisse trier en augmentant la première et la diminution deuxième élément? Si non, quelle est la meilleure façon d'y parvenir, en termes de design?
Je pensais à dériver une classe enfant de std::pair
qui l'emportaient sur tous les opérateurs de comparaison, mais nécessaire reinterpret_cast
ing std::pair<int, int>*
aux pointeurs de ma classe enfant qui se sent très mal.
Est-ce qu'une classe d'assistance statique séparée est la seule solution? (Mis à part les hacks comme multiplier tous les deuxièmes éléments par -1, sachant que toutes les valeurs sont positives.)
Je vois, donc vous dites que la comparaison personnalisée devrait exister en dehors de toute relation avec 'std :: pair', implémentée à la place dans le cadre de l'implémentation de quicksort. Ça a l'air propre, je vais le faire comme ça. Pourtant, je suis curieux de quelque chose, plus d'un point de vue théorique: –
Si, disons, un tas d'algorithmes dans '' ou une autre bibliothèque, manipulent et trie mon vecteur de 'std :: pair's très bien. Mais disons, maintenant, je veux que tous considèrent un ordre différent (par exemple, deuxième élément descendant). Alors ne semble-t-il pas inutile de demander à chaque algorithme de prendre un paramètre de comparaison? Avez-vous une idée de la raison pour laquelle «l'ordre» d'un type ne devrait pas être intrinsèque au type, par opposition à une responsabilité des choses manipulant ce type? –