Espacios de nombres
Variantes
Acciones

std::swap

De cppreference.com
< cpp‎ | algorithm
 
 
Biblioteca de algoritmos
Políticas de ejecución (C++17)
Operaciones de secuencia no modificantes
(C++11)(C++11)(C++11)
(C++17)
Operaciones de secuencia modificantes
Operaciones en almacenamiento no inicializado
Operaciones de partición
Operaciones de ordenación
(C++11)
Operaciones de búsqueda binaria
Operaciones de conjuntos (en rangos ordenados)
Operaciones de pila
(C++11)
Operaciones mínimo/máximo
(C++11)
(C++17)
Permutaciones
Operaciones numéricas
Bibliotecas C
 
Definido en el archivo de encabezado <algorithm>
(hasta C++11)
Definido en el archivo de encabezado <utility>
(desde C++11)
Definido en el archivo de encabezado <string_view>
template< class T >
void swap( T& a, T& b );
(1) (condicionalmente noexcept desde C++11)
(constexpr desde C++20)
template< class T2, std::size_t N >
void swap( T2 (&a)[N], T2 (&b)[N] );
(2) (condicionalmente noexcept desde C++11)
(constexpr desde C++20)

Intercambia los valores dados.

1) Intercambia los valores a y b.

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

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

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

(desde C++17)

Contenido

[editar] Parámetros

a, b - Los valores a intercambiar.
Requisitos de tipo
-
T debe cumplir con los requisitos de ConstruiblePorCopia y AsignablePorCopia (hasta C++11)ConstruiblePorMovimiento and AsignablePorMovimiento (desde C++11).
-
T2 debe satisfacer los requisitos de Intercambiable.

[editar] Valor de retorno

(Ninguno)

[editar] Excepciones

1)

(Ninguna)

(hasta C++11)
Especificación noexcept:   (desde C++11)
noexcept(

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

)
(desde C++11)
2)
Especificación noexcept:   (desde C++11)
noexcept(noexcept(swap(*a, *b)))
La búsqueda del identificador swap en la especificación de excepción encuentra esta plantilla de función además de lo que se encuentre por las reglas de búsqueda habituales, lo que hace la especificación de excepción equivalente a C++17 std::is_nothrow_swappable.
(desde C++11)
(hasta C++17)
Especificación noexcept:   (desde C++11)
(desde C++17)

[editar] Complejidad

1) Constante.
2) Lineal en N.

[editar] Especializaciones

std::swap puede especializarse en el espacio de nombres std para tipos definidos por el programa, pero tales especializaciones no se encuentran por la búsqueda dependiente de argumento (el espacio de nombres std no es el espacio de nombres asociado para los tipos definidos por el programa).

(hasta C++20)

La manera esperada de hacer intercambiable a un tipo definido por el programa es proporcionar una función no miembro swap en el mismo espacio de nombres que el tipo: véase Intercambiable para más detalles.

Las siguientes sobrecargas ya se proporcionan por la biblioteca estándar:

Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(función) [editar]
Especialización de std::swap para unique_lock
(plantilla de función) [editar]
Especialización de std::swap para shared_lock
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(plantilla de función) [editar]
Especializa al algoritmo std::swap.
(plantilla de función) [editar]
Especializa el algoritmo std::swap.
(función) [editar]
Especializa el algoritmo std::swap.
(función) [editar]
Especializa el algoritmo std::swap.
(función) [editar]
Especializa el algoritmo std::swap
(plantilla de función) [editar]
Intercambia dos rutas de acceso
(función) [editar]
Especializa el algoritmo std::swap.
(función) [editar]
Especializa el algoritmo std::swap.
(función) [editar]
Especializa el algoritmo std::swap.
(función) [editar]
Especializa el algoritmo std::swap
(función) [editar]
Especializa el algoritmo std::swap
(función) [editar]

[editar] 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, no se cumplen los requisitos de tipo
    swap(p, q);      // OK, ADL encuentra la función amiga `swap` apropiada
    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

[editar] Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 227 C++98 No era necesario que T fuera ConstruiblePorCopia o ConstruiblePorDefecto
(es posible que no se pueda construir un objeto temporal de tipo T).
También es necesario que
T sea ConstruiblePorCopia.
LWG 809 C++98 No se podían intercambiar los arrays. Se agregó una sobrecarga (2).
LWG 2554 C++11 Intercambiar arrays multidimensionales nunca podía ser
noexcept debido a problemas de búsqueda de nombres.
Se hizo funcionar.

[editar] Véase también

Intercambia los valores de dos objetos.
(objeto punto de personalización) [editar]
Intercambia los elementos a los que apuntan dos iteradores
(plantilla de función) [editar]
Intercambia dos rangos de elementos.
(plantilla de función) [editar]
(C++14)
Reemplaza el argumento con un valor nuevo y devuelve su valor previo.
(plantilla de función) [editar]