Namespaces
Variants

std::swap

Von de.cppreference.net
 
 
Algorithmenbibliothek
Eingeschränkte Algorithmen und Algorithmen auf Bereichen (C++20)
Eingeschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Nicht modifizierende Sequenzoperationen    
Batch-Operationen
(C++17)
Suchoperationen
Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Generierungsoperationen
Entfernungsoperationen
Reihenfolgeänderungsoperationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
(C++11)    

Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Mischoperationen (auf sortierten Bereichen)
Heap-Operationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikografische Vergleichsoperationen
Permutationsoperationen


 
Definiert in Header <algorithm>
(bis C++11)
Definiert in Header <utility>
(seit C++11)
Definiert in Header <string_view>
template< class T >
void swap( T& a, T& b );
(1) (bedingt noexcept seit C++11)
(constexpr seit C++20)
template< class T2, std::size_t N >
void swap( T2 (&a)[N], T2 (&b)[N] );
(2) (bedingt noexcept seit C++11)
(constexpr seit C++20)

Tauscht die gegebenen Werte aus.

1) Vertauscht die Werte a und b.

Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn std::is_move_constructible_v<T> && std::is_move_assignable_v<T> true ist.

(seit C++17)
2) Vertauscht die Arrays a und b. Äquivalent zu std::swap_ranges(a, a + N, b).

Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn std::is_swappable_v<T2> true ist.

(seit C++17)

Parameter

a, b - die zu vertauschenden Werte
Typanforderungen
-
T muss die Anforderungen von CopyConstructible und CopyAssignable (bis C++11) MoveConstructible und MoveAssignable (seit C++11) erfüllen.
-
T2 muss die Anforderungen von Swappable erfüllen.

Rückgabewert

(keine)

Ausnahmen

1)

(keine)

(bis C++11)
noexcept Spezifikation:
(seit C++11)
2)
noexcept Spezifikation:
noexcept ( noexcept ( swap ( * a, * b ) ) )
Die Suche nach dem Bezeichner swap in der Ausnahmespezifikation findet diese Funktionsvorlage zusätzlich zu allem, was durch die üblichen Suchregeln gefunden wird, wodurch die Ausnahmespezifikation äquivalent zu C++17 std::is_nothrow_swappable ist.
(seit C++11)
(bis C++17)
noexcept Spezifikation:
noexcept ( std:: is_nothrow_swappable_v < T2 > )
(seit C++17)

Komplexität

1) Konstante.
2) Linear in N .

Spezialisierungen

std::swap kann für programmdefinierte Typen in namespace std spezialisiert werden , aber solche Spezialisierungen werden durch ADL nicht gefunden (der namespace std ist nicht der assoziierte Namensraum für den programmdefinierten Typ).

(bis C++20)

Die erwartete Methode, um einen programmdefinierten Typ swappable zu machen, ist das Bereitstellen einer Nicht-Member-Funktion swap im selben Namensraum wie der Typ: siehe Swappable für Details.

Die folgenden Überladungen sind bereits durch die Standardbibliothek bereitgestellt:

spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktionsschablone)
spezialisiert den std::swap Algorithmus
(Funktionsschablone)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktionsschablone)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktionsschablone)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktionsschablone)
spezialisiert den std::swap Algorithmus
(Funktionsschablone)
spezialisiert den std::swap Algorithmus
(Funktionsschablone)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktionstemplate)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktionsschablone)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktionsschablone)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktionstemplate)
spezialisiert den std::swap Algorithmus
(Funktionsschablone)
spezialisiert den std::swap Algorithmus
(Funktionsschablone)
spezialisiert den std::swap Algorithmus
(Funktion)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktionsschablone)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktion)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktionsschablone)
spezialisiert den std::swap Algorithmus
(Funktion)
spezialisiert den std::swap Algorithmus
(Funktion)
spezialisiert den std::swap Algorithmus
(Funktion)
spezialisiert den std::swap Algorithmus
(Funktion)
spezialisiert den std::swap Algorithmus
(Funktion)
spezialisiert den std::swap Algorithmus
(Funktion)

Beispiel

#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); // Fehler, Typanforderungen nicht erfüllt
    swap(p, q);      // OK, ADL findet die passende friend `swap`
    std::cout << p << ' ' << q << '\n';
}

Ausgabe:

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

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 227 C++98 T war nicht erforderlich CopyConstructible oder DefaultConstructible zu sein
(ein temporäres Objekt vom Typ T könnte möglicherweise nicht konstruiert werden)
T wird ebenfalls benötigt
um CopyConstructible zu sein
LWG 809 C++98 Arrays konnten nicht getauscht werden Überladung hinzugefügt (2)
LWG 2554 C++11 Tauschen mehrdimensionaler Arrays kann niemals
noexcept sein aufgrund von Namensauflösungsproblemen
funktionsfähig gemacht

Siehe auch

vertauscht die Werte zweier Objekte
(Customization-Point-Objekt)
vertauscht die Elemente, auf die zwei Iteratoren zeigen
(Funktionstemplate)
vertauscht zwei Bereiche von Elementen
(Funktionstemplate & Algorithmus-Funktionsobjekt)
(C++14)
ersetzt das Argument durch einen neuen Wert und gibt seinen vorherigen Wert zurück
(Funktionstemplate)