2010-07-10 5 views

Répondre

23

Utilisez std::swap

std::swap(var1, var2); 
+3

Je suis d'accord avec l'utilisation de std :: swap Avec la mise en garde que std :: swap utilise les constructeurs de copie de tout ce que vous permutez. Gardez donc à l'esprit que c'est bien pour les types de données primitifs mais une fois que vous commencez à entrer dans des structures et des classes plus grandes, cela devient moins efficace. http://www.cplusplus.com/reference/algorithm/swap/ –

+3

@C Nielsen, mais vous pouvez utiliser l'idiome habituel et spécialiser 'std :: swap' pour les classes coûteuses afin d'éviter un temporaire. –

+0

De tels objets plus volumineux peuvent surcharger 'std :: swap' s'il existe une méthode plus efficace. –

5

Comme le dit Stephen, utilisez std::swap(var1, var2);

Il est une fonction basé sur un modèle, de sorte que vous pouvez fournir vos propres spécialisations pour les classes spécifiques tels que les pointeurs intelligents, qui peuvent avoir des opérateurs d'affectation coûteux:

namespace std 
{ 
    template<> 
    void swap<MySmartPointer>(MySmartPointer& v1, MySmartPointer& v2) 
    { 
     std::swap(v1.internalPointer, v2.internalPointer); 
    } 
} 

// ... 

std::swap(pointerA, pointerB); // super-fast!!!!1 
+3

Assurez-vous de lire les discussions dans [Comment surcharger 'std :: swap'] (http: // stackoverflow. com/questions/11562/how-to-overload-stdswap) question. C'est une bonne approche, mais vous devez être conscient des problèmes qui y sont associés. –

1

Il y a aussi Boost Swap.

http://www.boost.org/doc/libs/1_43_0/libs/utility/swap.html

Il surmonte certaines des limitations actuelles dans la mise en œuvre d'échange standard. Vous devez toujours fournir vos propres spécialisations si vous voulez une meilleure efficacité pour vos types, mais vous avez un peu plus de latitude quant à la façon de fournir ces spécialisations.

Questions connexes