Namespaces
Variants

std::swap

de es.cppreference.net
(Redirigido desde cpp/utility/swap)
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificadoras
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones de cambio de orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Ordenamiento y operaciones relacionadas
Operaciones de partición
(C++11)    

Operaciones de ordenamiento
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjuntos (en rangos ordenados)
Operaciones de fusión (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutación


 
Definido en el encabezado <algorithm>
(hasta C++11)
Definido en el encabezado <utility>
(desde C++11)
Definido en el encabezado <string_view>
template< class T >
void swap( T& a, T& b );
(1) (noexcept condicionalmente desde C++11)
(constexpr desde C++20)
template< class T2, std::size_t N >
void swap( T2 (&a)[N], T2 (&b)[N] );
(2) (noexcept condicionalmente desde C++11)
(constexpr desde C++20)

Intercambia los valores dados.

1) Intercambia los valores a y b.

Esta sobrecarga participa en la resolución de sobrecarga solo si std::is_move_constructible_v<T> && std::is_move_assignable_v<T> es true.

(desde C++17)
2) Intercambia los arreglos a y b. Equivalente a std::swap_ranges(a, a + N, b).

Esta sobrecarga participa en la resolución de sobrecarga solo si std::is_swappable_v<T2> es true.

(desde C++17)

Parámetros

a, b - los valores a intercambiar
Requisitos de tipo
-
T debe cumplir con los requisitos de CopyConstructible y CopyAssignable (hasta C++11) MoveConstructible y MoveAssignable (desde C++11) .
-
T2 debe cumplir con los requisitos de Swappable .

Valor de retorno

(ninguno)

Excepciones

1)

(ninguno)

(hasta C++11)
noexcept especificación:
(desde C++11)
2)
noexcept especificación:
noexcept ( noexcept ( swap ( * a, * b ) ) )
La búsqueda del identificador swap en la especificación de excepciones encuentra esta plantilla de función además de cualquier resultado encontrado por las reglas de búsqueda habituales, haciendo que la especificación de excepciones sea equivalente a C++17 std::is_nothrow_swappable .
(desde C++11)
(hasta C++17)
noexcept especificación:
noexcept ( std:: is_nothrow_swappable_v < T2 > )
(desde C++17)

Complejidad

1) Constante.
2) Lineal en N .

Especializaciones

std::swap puede ser especializado en el espacio de nombres std para tipos definidos por el programa, pero tales especializaciones no son encontradas por ADL (el espacio de nombres std no es el espacio de nombres asociado para el tipo definido por el programa).

(until C++20)

La forma esperada de hacer que un tipo definido por el programa sea intercambiable es proporcionar una función no miembro swap en el mismo espacio de nombres que el tipo: consulte Swappable para más detalles.

Las siguientes sobrecargas ya están proporcionadas por la biblioteca estándar:

especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(plantilla de función)
especializa el algoritmo std::swap
(función)
especializa el algoritmo std::swap
(función)
especializa el algoritmo std::swap
(función)
especializa el algoritmo std::swap
(función)
especializa el algoritmo std::swap
(función)
especializa el algoritmo std::swap
(función)

Ejemplo

#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';
}

Salida:

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

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 227 C++98 T no se requería que fuera CopyConstructible o DefaultConstructible
(un objeto temporal de tipo T podría no poder construirse)
T también se requiere que
sea CopyConstructible
LWG 809 C++98 los arrays no podían intercambiarse se añadió la sobrecarga (2)
LWG 2554 C++11 intercambiar arrays multidimensionales nunca
puede ser noexcept debido a problemas de búsqueda de nombres
se hizo funcionar

Véase también

intercambia los valores de dos objetos
(objeto de punto de personalización)
intercambia los elementos a los que apuntan dos iteradores
(plantilla de función)
intercambia dos rangos de elementos
(plantilla de función & objeto función de algoritmo)
(C++14)
reemplaza el argumento con un nuevo valor y devuelve su valor anterior
(plantilla de función)