std::swap
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.
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) |
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
(Ninguna) | (hasta C++11) | ||||||
Especificación noexcept: (desde C++11)
| (desde C++11) |
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) |
(desde C++17) |
[editar]Complejidad
[editar]Especializaciones
| (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:
(C++11) | Especializa el algoritmo std::swap. (plantilla de función) |
(C++11) | Especializa el algoritmo std::swap. (plantilla de función) |
(C++11) | Especializa el algoritmo std::swap. (plantilla de función) |
(C++11) | Especializa el algoritmo std::swap. (plantilla de función) |
(C++11) | Especializa el algoritmo std::swap. (plantilla de función) |
(C++11) | Especializa el algoritmo std::swap. (plantilla de función) |
Especializa el algoritmo std::swap (plantilla de función) | |
(C++11) | Especializa el algoritmo std::swap. (plantilla de función) |
Especializa el algoritmo std::swap. (plantilla de función) | |
(C++11) | 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) | |
(C++11) | Especializa el algoritmo std::swap. (plantilla de función) |
Especializa el algoritmo std::swap. (plantilla de función) | |
(C++11) | Especializa el algoritmo std::swap. (plantilla de función) |
(C++11) | 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) | |
(C++11) | Especializa el algoritmo std::swap. (plantilla de función) |
Especializa el algoritmo std::swap. (plantilla de función) | |
(C++11) | Especializa el algoritmo std::swap. (función) |
Especialización de std::swap para unique_lock (plantilla de función) | |
(C++14) | Especialización de std::swap para shared_lock (plantilla de función) |
(C++11) | Especializa el algoritmo std::swap. (plantilla de función) |
Especializa al algoritmo std::swap. (plantilla de función) | |
(C++17) | Especializa el algoritmo std::swap. (función) |
(C++17) | Especializa el algoritmo std::swap. (función) |
(C++17) | Especializa el algoritmo std::swap. (función) |
Especializa el algoritmo std::swap (plantilla de función) | |
Intercambia dos rutas de acceso (función) | |
(C++23) | Especializa el algoritmo std::swap. (función) |
(C++20) | Especializa el algoritmo std::swap. (función) |
Especializa el algoritmo std::swap. (función) | |
(C++20) | Especializa el algoritmo std::swap (función) |
(C++20) | Especializa el algoritmo std::swap (función) |
[editar]Ejemplo
#include <algorithm>#include <iostream> namespace Ns {class A {int id {}; friendvoid swap(A& lhs, A& rhs){std::cout<<"swap("<< lhs <<", "<< rhs <<")\n"; std::swap(lhs.id, rhs.id);} friendstd::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` apropiadastd::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 queT 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 sernoexcept debido a problemas de búsqueda de nombres. | Se hizo funcionar. |
[editar]Véase también
(C++20) | Intercambia los valores de dos objetos. (objeto 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) | |
(C++14) | Reemplaza el argumento con un valor nuevo y devuelve su valor previo. (plantilla de función) |