Namensräume
Varianten
Aktionen

std::swap

Von cppreference.com
< cpp‎ | algorithm
 
 
Algorithmenbibliothek
Beschränkte Algorithmen und Algorithmen für Bereiche (C++20)
Beschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Ausführungsrichtlinien (C++17)
Nicht-modifizierende Sequenzoperationen
Stapeloperationen
(C++17)
Suchoperationen
(C++11)                (C++11)(C++11)

Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
swap
Transformationsoperationen
Generierungsoperationen
Entfernungsoperationen
Ordnungsändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Zusammenführungsoperationen (auf sortierten Bereichen)
Heapoperationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikographische Vergleichsoperationen
Permutationsoperationen
C-Bibliothek
Numerische Operationen
Operationen auf uninitialisiertem Speicher
 
Definiert in Header <algorithm>
(bis C++11)
Definiert in der Header-Datei <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.

1) Tauscht die Werte a und b.

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

(seit C++17)
2) Tauscht die Arrays a und b. Entspricht std::swap_ranges(a, a + N, b).

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

(seit C++17)

Inhalt

[edit] Parameter

a, b - die zu tauschenden 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.

[edit] Rückgabewert

(keine)

[edit] Ausnahmen

1)

(keine)

(bis C++11)
noexcept-Spezifikation:  
noexcept(

    std::is_nothrow_move_constructible<T>::value &&
    std::is_nothrow_move_assignable<T>::value

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

[edit] Komplexität

1) Konstant.
2) Linear in N.

[edit] Spezialisierungen

std::swap kann für von Programmen definierte Typen im Namespace std spezialisiert werden, aber solche Spezialisierungen werden von ADL nicht gefunden (der Namespace std ist nicht der assoziierte Namespace für den von Programmen definierten Typ).

(bis C++20)

Der erwartete Weg, einen von Programmen definierten Typ tauschbar zu machen, ist die Bereitstellung einer nicht-Member-Funktion swap im selben Namespace wie der Typ: siehe Swappable für Details.

Die folgenden Überladungen werden bereits von der Standardbibliothek bereitgestellt

spezialisiert den std::swap Algorithmus
(Funktionsvorlage) [edit]
spezialisiert den std::swap Algorithmus
(function template) [bearbeiten]
spezialisiert den std::swap Algorithmus
(Funktionsschablone) [bearbeiten]
spezialisiert den std::swap Algorithmus
(Funktionsschablone) [bearbeiten]
spezialisiert den std::swap Algorithmus
(Funktionsschablone) [bearbeiten]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(Funktionsvorlage) [edit]
spezialisiert den std::swap Algorithmus
(Funktionsvorlage) [edit]
spezialisiert den std::swap Algorithmus
(Funktionsvorlage) [edit]
spezialisiert den std::swap Algorithmus
(Funktionsvorlage) [edit]
spezialisiert den std::swap Algorithmus
(Funktionsvorlage) [edit]
spezialisiert den std::swap Algorithmus
(Funktionsvorlage) [edit]
spezialisiert den std::swap Algorithmus
(Funktionsvorlage) [edit]
spezialisiert den std::swap Algorithmus
(Funktionsvorlage) [edit]
spezialisiert den std::swap Algorithmus
(Funktionsschablone) [edit]
spezialisiert den std::swap Algorithmus
(Funktionsvorlage) [edit]
spezialisiert den std::swap Algorithmus
(Funktionsvorlage) [edit]
spezialisiert den std::swap Algorithmus
(Funktionsvorlage) [edit]
spezialisiert den std::swap Algorithmus
(Funktionsvorlage) [edit]
spezialisiert den std::swap Algorithmus
(function template) [bearbeiten]
spezialisiert den std::swap Algorithmus
(Funktionstemplate) [bearbeiten]
spezialisiert den std::swap Algorithmus
(Funktion) [bearbeiten]
spezialisiert den std::swap Algorithmus
(Funktionsvorlage) [edit]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(Funktionstemplates) [bearbeiten]
spezialisiert den std::swap Algorithmus
(Funktionstemplates) [bearbeiten]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(function) [edit]
spezialisiert den std::swap Algorithmus
(function template) [bearbeiten]
spezialisiert den std::swap Algorithmus
(function template) [edit]
spezialisiert den std::swap Algorithmus
(Funktion) [edit]
spezialisiert den std::swap Algorithmus
(Funktion) [bearbeiten]
spezialisiert den std::swap Algorithmus
(Funktion) [bearbeiten]
spezialisiert den std::swap Algorithmus
(Funktion) [edit]
spezialisiert den std::swap Algorithmus
(Funktion) [edit]
spezialisiert den std::swap Algorithmus
(Funktion) [edit]

[edit] 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); // error, type requirements are not satisfied
    swap(p, q);      // OK, ADL finds the appropriate 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

[edit] Fehlerberichte

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

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 227 C++98 T musste nicht CopyConstructible oder DefaultConstructible sein
(ein temporäres Objekt vom Typ T konnte möglicherweise nicht konstruiert werden)
T muss auch
CopyConstructible sein
LWG 809 C++98 Arrays konnten nicht getauscht werden Überladung (2) hinzugefügt
LWG 2554 C++11 mehrdimensionale Arrays zu tauschen kann niemals
sein noexcept aufgrund von Namensauflösungsproblemen
wurde behoben

[edit] Siehe auch

tauscht die Werte von zwei Objekten
(Customization Point Objekt)[edit]
Tauscht die Elemente, auf die zwei Iteratoren zeigen
(Funktionstempelat) [edit]
Tauscht zwei Elementbereiche
(Funktionstempelat) [edit]
(C++14)
ersetzt das Argument durch einen neuen Wert und gibt seinen vorherigen Wert zurück
(Funktionsvorlage) [edit]