Si j'ai un conteneur puis-je spécialiser IE, si j'écris ce qui suit, si j'écris ce qui suit, tout effet sur les algorithmes standard? p> Le bénéfice de cette spécialisation est qu'il envoie des pointeurs plutôt que des instances complètes, de sorte que c'est plus rapide (potentiellement). p> p> std :: vecteur
indirectiterator code> qui enveloppe
std :: vecteur
t code> S plutôt que
t * code>'s.
iter_swap code> pour
indirectitéator code> pour effectuer des algorithmes standard (tels que
std :: tri code>) échangez des éléments par pointeur? p>
3 Réponses :
Aussi loin que je peux voir, iter_swap code> est utilisé uniquement dans
std :: inverse code>, et il ne mentionne aucun type de recherche dépendante de l'argument: il utilise toujours
std :: iter_swap code>. Et puisque vous n'êtes pas autorisé à surcharger des fonctions dans l'espace de nom code> std code>, vous n'avez pas de chance. P>
Vérification des en-têtes de Libc ++ Ceci semble correct, bien que ce soit un peu décevant. Je suppose que je peux le faire avec une classe de référence personnalisée, mais je ne suis pas sûr que cela en vaut la peine de faire swap plus agréable.
En C ++ 11 (au moins), std :: Trier code> utilise
std :: iter_swap code>. (Et j'ai dû spécialiser / définir
std :: iter_swap code> pour créer un certain travail spécial itérateur avec
std :: Trier code>.
Vous êtes toujours autorisé à spécialiser les modèles dans std code> Espace de noms tant qu'ils sont spécialisés pour les arguments définis par l'utilisateur.
En outre, le fait qu'une implémentation utilise uniquement std :: iter_swap code> au même endroit ne signifie pas que c'est le seul endroit où il est utilisé, jamais, ni que cette utilisation est complètement correcte ...
@Ant et b> tant que vous gardez la même sémantique que la version non spécialisée.
puis-je spécialiser
iter_swap code> pour
indirectiterator code> pour faire standard algorithmes (tels que
std :: trier code>) échange d'éléments par pointeur? p> blockQuote>
Vous pouvez toujours faire votre surcharge / spécialisation. Cependant, votre question est de savoir si vous pouvez spécialiser
iter_swap code> intérieur em> l'espace de noms
std code>. P>
Je pense que la réponse n'est pas claire de la norme. J'ai constaté que dans certains cas, je devais définir un
iTER_SWAP iTER_SWAP iTER_SWAP code> std code> de sorte que
std :: Trier code> l'utilise. Dans gcc std lib
std :: trier code> utilise le qualifié
std :: iter_swap code>. p>
Ceci est probablement un défaut dans
std :: Trier code>. IMo
std :: Trier code> doit appeler un
Swap_iter CODE>. P>
I.e., Si j'écris ce qui suit, cela aura-t-il un effet sur la norme algorithmes? P> blockQuote>
pas dans GCC (au moins) car des algorithmes standard utilisent qualifié
std :: iter_swap code> (bug?) Je ne pense pas que la norme soit claire à ce sujet. P>
Vous êtes autorisé à rouvrir std code> Modèles de noms de noms et de spécialisation à l'intérieur
std code> tant que vous les spécialisez pour les types définis par l'utilisateur. Dans votre cas, vous pouvez réellement se spécialiser
std :: iter_swap code> à vos fonctions, assurez-vous simplement de le faire dans
std code> Espace de noms, non dans votre propre espace de noms (comme dans votre exemple ). Ce n'est pas très élégant, mais c'est permis. P>