J'ai un J'utilise le Comment puis-je trier les éléments réels de cette liste? p> std :: Liste
myClass :: opérateur <(myClass & Autre) code> défini. P>
std :: list.sort () code> fonction, mais cela ne change rien dans cette liste. Peut-être qu'il trie juste les pointeurs? P>
5 Réponses :
Ça trier le pointeur comme STD :: Tri (conteneur) Utilisez l'opérateur template<class T>
struct ptr_comparison
{
bool operator()(T* a, T* b) { return *a < *b; }
};
list<myclass*> mylist;
// later
mylist.sort(ptr_comparison<myclass>());
-1 Pour l'utilisation de std :: Trier code> sur un
std :: Liste code>. En outre, l'instantantion de
pTR_comparision code> est incorrecte.
Vous triez les valeurs du pointeur, pas les valeurs MyClass. Vous devez écrire votre propre prédicat pour comparer les pointeurs par Dréréférence:
struct PPred { template <typename T> inline bool operator()(const T * a, const T * b) const { return *a < *b; } };
Vous pouvez utiliser une fonction au lieu d'une structure. C'est un peu moins verbeux.
Étant donné que vous utilisez const t * code>, l'OP doit définir une comparaison comme
opérateur <(const t &) const code>.
Etienne: Parfaitement à droite, je pensais que je serais partiellement spécialisé quelque chose sur le chemin, mais ne se révèle pas je ne suis pas. Édition! Nawaz: aussi à droite, édition!
Quelle est la syntaxe pour une "référence constante à un pointeur à t"? :-(
t * const & code> Il n'y a aucune raison d'utiliser une référence ici, bien que
@James: Juste pour des rires, car les prédicats sont généralement appelés par const-référence ... mais je passerais généralement le pointeur-to-cons-t par copie aussi :-)
@Alf: whoops, typo! Désolé!
J'ai ensuite utilisé myList.sort (pomp ()), mais je suppose que c'est la même chose.
@Quueeuerflow: avec ma version actuelle de l'exemple, myList.sort (pomp ()) code> ne doit pas fonctionner, car
pomp code> est juste une fonction, pas un nom de classe, et non un nom de classe et Depuis que vous devez spécifier le paramètre de modèle. Seuls
myList.sort (pompet
Ceci est un autre avantage d'utiliser un objet fonction au lieu d'une fonction: vous pouvez réduire la générosité dans la surcharge de l'opérateur () code> de sorte que la structure nommée ne soit pas générique. Au lieu d'utiliser
pomp
pomp () code>.
@James: bon point! J'ai ajouté le code pour le prédicat pour inclure cet aspect.
Méfiez-vous de l'alternative! std :: set est uniquement destiné aux listes uniques. Vous pouvez trouver votre choix vous donnera moins d'articles que vous n'aviez auparavant.
En supposant que vous n'avez pas de points nuls dans votre liste, faites
mylist.sort( []( myclass *a, myclass *b ) { return *a < *b } );
ptrsorter code> doit renvoyer
bool code> au lieu de
vide code>
Plusieurs réponses proposent d'utiliser un prédicat qui prend explicitement deux pointeurs; Cela fonctionnera pour votre cas actuel où vous avez un conteneur de pointes bruts, mais cela ne fonctionnera pas pour aucun autre type déréférenciférable, comme des pointeurs intelligents ou des itérateurs.
Pourquoi ne pas aller à l'itinéraire plus général et correspond à n'importe quel type? < / p> tandis qu'une référence de const est inutile pour un Alternativement, vous pouvez envisager d'utiliser quelque chose comme Boost's t * code>, il est nécessaire pour les types de pointeur intelligents qui sont relativement coûteux à copier (par exemple,
std :: partage_ptr code>) ou impossible à copier (par exemple,
std :: unique_ptr code>). P>
indirect_iterator code>
, qui déplace l'indirection dans le itérateur et peut faire un code beaucoup plus propre. p> p>
J'essayais de l'exemple du modèle Pompez et puisque les autres classes utiliseraient le pomp, je suis bloqué dans le fichier incluant pour la classe La classe STD :: La liste était tenue. Cependant, quand j'ai compilé la tâche, j'ai obtenu cette tâche: Le modèle est: p> Les appels que j'ai essayés dans fdfttsbfdftbleloadap.c étaient : p> ou p> t p> uniquement lorsque le modèle a été déclaré dans FDFTSBFDFTABLELOADAPPLOP Compiler OK. Alors, comment puis-je obtenir cela pour compiler si le modèle est dans une autre classe, notamment? P> P>
Ceci est une nouvelle question. S'il vous plaît poser une nouvelle question de telle sorte que les gens puissent vous donner une réponse et tout simplement pas de simples commentaires :-).
Êtes-vous sûr que
std :: liste code> est le bon conteneur pour votre cas d'utilisation? C'est rarement un bon choix;
std :: vecteur code> ou
std :: deque code> fournit généralement des caractéristiques de performance plus favorables. Êtes-vous sûr que vous devez stocker des pointeurs bruts dans le conteneur? C'est aussi rarement un bon choix; Habituellement, il est préférable de stocker vos objets dans le conteneur au lieu des pointeurs et si vous utilisez des pointeurs, des pointeurs intelligents doivent être utilisés.
Remarque: si vous faites
opérateur << / code> un membre, il devrait s'agir d'une fonction membre code> const code>. Mais généralement, il devrait être un non-membre quand même. Voir Cette entrée de FAQ .