Namespaces
Variants

std::swap

Depuis fr.cppreference.net
(Redirigé depuis cpp/utility/swap)
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur plages (C++20)
Algorithmes contraints, par ex. ranges::copy, ranges::sort, ...
Opérations de séquences non modificatrices    
Opérations par lots
(C++17)
Opérations de recherche
Opérations de séquence modificatrices
Opérations de copie
(C++11)
(C++11)
Opérations d'échange
Opérations de transformation
Opérations de génération
Opérations de suppression
Opérations de changement d'ordre
(jusqu'à C++17)(C++11)
(C++20)(C++20)
Opérations d'échantillonnage
(C++17)

Tri et opérations connexes
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche dichotomique
(sur plages partitionnées)
Opérations ensemblistes (sur plages triées)
Opérations de fusion (sur plages triées)
Opérations de tas
Opérations minimum/maximum
(C++11)
(C++17)
Opérations de comparaison lexicographique
Opérations de permutation


 
Défini dans l'en-tête <algorithm>
(jusqu'à C++11)
Défini dans l'en-tête <utility>
(depuis C++11)
Défini dans l'en-tête <string_view>
template< class T >
void swap( T& a, T& b );
(1) (conditionnellement noexcept depuis C++11)
(constexpr depuis C++20)
template< class T2, std::size_t N >
void swap( T2 (&a)[N], T2 (&b)[N] );
(2) (conditionnellement noexcept depuis C++11)
(constexpr depuis C++20)

Échange les valeurs données.

1) Échange les valeurs a et b.

Cette surcharge participe à la résolution de surcharge uniquement si std::is_move_constructible_v<T> && std::is_move_assignable_v<T> satisfait true.

(depuis C++17)
2) Échange les tableaux a et b. Équivalent à std::swap_ranges(a, a + N, b).

Cette surcharge participe à la résolution de surcharge uniquement si std::is_swappable_v<T2> satisfait true.

(depuis C++17)

Paramètres

a, b - les valeurs à échanger
Exigences de type
-
T doit satisfaire aux exigences de CopyConstructible et CopyAssignable (jusqu'à C++11) MoveConstructible et MoveAssignable (depuis C++11) .
-
T2 doit satisfaire aux exigences de Swappable .

Valeur de retour

(aucun)

Exceptions

1)

(aucun)

(jusqu'à C++11)
noexcept spécification :
(depuis C++11)
2)
noexcept spécification :
noexcept ( noexcept ( swap ( * a, * b ) ) )
La recherche de l'identifiant swap dans la spécification d'exception trouve ce modèle de fonction en plus de tout ce qui est trouvé par les règles de recherche habituelles, rendant la spécification d'exception équivalente à C++17 std::is_nothrow_swappable .
(depuis C++11)
(jusqu'à C++17)
noexcept spécification :
noexcept ( std:: is_nothrow_swappable_v < T2 > )
(depuis C++17)

Complexité

1) Constante.
2) Linéaire en N .

Spécialisations

std::swap peut être spécialisé dans l'espace de noms std pour les types définis par le programme, mais ces spécialisations ne sont pas trouvées par ADL (l'espace de noms std n'est pas l'espace de noms associé pour le type défini par le programme).

(jusqu'à C++20)

La manière attendue de rendre un type défini par le programme interchangeable est de fournir une fonction non-membre swap dans le même espace de noms que le type : voir Swappable pour plus de détails.

Les surcharges suivantes sont déjà fournies par la bibliothèque standard :

spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(fonction template)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(fonction template)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(fonction template)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(fonction template)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)
spécialise l'algorithme std::swap
(fonction)
spécialise l'algorithme std::swap
(fonction)
spécialise l'algorithme std::swap
(fonction)
spécialise l'algorithme std::swap
(fonction)
spécialise l'algorithme std::swap
(fonction)
spécialise l'algorithme std::swap
(fonction)

Exemple

#include <algorithm>
#include <iostream>
namespace Ns
{
    class A
    {
        int id {};
        friend void swap(A& lhs, A& rhs)
        {
            std::cout << "swap(" << lhs << ", " << rhs << ")\n";
            std::swap(lhs.id, rhs.id);
        }
        friend std::ostream& operator<<(std::ostream& os, A const& a)
        {
            return os << "A::id=" << a.id;
        }
    public:
        A(int i) : id {i} {}
        A(A const&) = delete;
        A& operator = (A const&) = delete;
    };
}
int main()
{
    int a = 5, b = 3;
    std::cout << a << ' ' << b << '\n';
    std::swap(a, b);
    std::cout << a << ' ' << b << '\n';
    Ns::A p {6}, q {9};
    std::cout << p << ' ' << q << '\n';
//  std::swap(p, q); // erreur, les exigences de type ne sont pas satisfaites
    swap(p, q);      // OK, ADL trouve la fonction `swap` amie appropriée
    std::cout << p << ' ' << q << '\n';
}

Sortie :

5 3
3 5
A::id=6 A::id=9
swap(A::id=6, A::id=9)
A::id=9 A::id=6

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement tel que publié Comportement correct
LWG 227 C++98 T n'était pas requis d'être CopyConstructible ou DefaultConstructible
(un objet temporaire de type T pourrait ne pas pouvoir être construit)
T est également requis d'
être CopyConstructible
LWG 809 C++98 les tableaux ne pouvaient pas être échangés surcharge ajoutée (2)
LWG 2554 C++11 l'échange de tableaux multidimensionnels ne peut jamais
être noexcept en raison de problèmes de recherche de nom
rendu fonctionnel

Voir aussi

échange les valeurs de deux objets
(objet point de personnalisation)
échange les éléments pointés par deux itérateurs
(modèle de fonction)
échange deux intervalles d'éléments
(modèle de fonction & objet fonction d'algorithme)
(C++14)
remplace l'argument par une nouvelle valeur et retourne sa valeur précédente
(modèle de fonction)