9
votes

ITER_SWAP peut-il être spécialisé?

Si j'ai un conteneur std :: vecteur éléments , je peux créer un indirectiterator qui enveloppe std :: vecteur :: itérateur et permet d'itération sur t S plutôt que t * 's.

puis-je spécialiser iter_swap pour indirectitéator pour effectuer des algorithmes standard (tels que std :: tri ) échangez des éléments par pointeur?

IE, si j'écris ce qui suit, si j'écris ce qui suit, tout effet sur les algorithmes standard? xxx

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).


0 commentaires

3 Réponses :


2
votes

Aussi loin que je peux voir, iter_swap est utilisé uniquement dans std :: inverse , et il ne mentionne aucun type de recherche dépendante de l'argument: il utilise toujours std :: iter_swap . Et puisque vous n'êtes pas autorisé à surcharger des fonctions dans l'espace de nom std , vous n'avez pas de chance.


5 commentaires

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 utilise std :: iter_swap . (Et j'ai dû spécialiser / définir std :: iter_swap pour créer un certain travail spécial itérateur avec std :: Trier .


Vous êtes toujours autorisé à spécialiser les modèles dans std 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 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 tant que vous gardez la même sémantique que la version non spécialisée.



1
votes

puis-je spécialiser iter_swap pour indirectiterator pour faire standard algorithmes (tels que std :: trier ) échange d'éléments par pointeur?

Vous pouvez toujours faire votre surcharge / spécialisation. Cependant, votre question est de savoir si vous pouvez spécialiser iter_swap intérieur l'espace de noms std .

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 std de sorte que std :: Trier l'utilise. Dans gcc std lib std :: trier utilise le qualifié std :: iter_swap .

Ceci est probablement un défaut dans std :: Trier . IMo std :: Trier doit appeler un Swap_iter .

I.e., Si j'écris ce qui suit, cela aura-t-il un effet sur la norme algorithmes?

pas dans GCC (au moins) car des algorithmes standard utilisent qualifié std :: iter_swap (bug?) Je ne pense pas que la norme soit claire à ce sujet.


0 commentaires

1
votes

Vous êtes autorisé à rouvrir std Modèles de noms de noms et de spécialisation à l'intérieur std 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 à vos fonctions, assurez-vous simplement de le faire dans std 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.


0 commentaires