std::iter_swap
De cppreference.com
<tbody>
</tbody>
| Definido en el archivo de encabezado <algorithm>
|
||
template< class ForwardIt1, class ForwardIt2 > void iter_swap( ForwardIt1 a, ForwardIt2 b ); |
(constexpr desde C++20) | |
Intercambia los valores de los elementos a los que apuntan los iteradores indicados.
Si se cumple alguna de las siguientes condiciones, el comportamiento no está definido:
aobno es desreferenciable.*ano es Intercambiable con*b.
Parámetros
| a, b | - | Iteradores de los elementos a intercambiar. |
| Requisitos de tipo | ||
-ForwardIt1, ForwardIt2 debe satisfacer los requisitos de IteradorDeAvanceLegado.
| ||
Valor de retorno
(Ninguno)
Complejidad
Constante.
Notas
Esta plantilla de función modela la semántica de la operación de intercambio dada por Intercambiable. Es decir, se consideran las sobrecargas de swap encontradas por búsqueda dependiente de argumento y la alternativa de std::swap.
Posible implementación
template<class ForwardIt1, class ForwardIt2>
constexpr //< desde C++20
void iter_swap(ForwardIt1 a, ForwardIt2 b)
{
using std::swap;
swap(*a, *b);
}
|
Ejemplo
Lo siguiente es una implementación del ordenamiento por selección en C++.
Ejecuta este código
#include <algorithm>
#include <iostream>
#include <random>
#include <string_view>
#include <vector>
template<class ForwardIt>
void selection_sort(ForwardIt begin, ForwardIt end)
{
for (ForwardIt it = begin; it != end; ++it)
std::iter_swap(it, std::min_element(it, end));
}
void println(std::string_view rem, std::vector<int> const& v)
{
std::cout << rem;
for (int e : v)
std::cout << e << ' ';
std::cout << '\n';
}
template<int min, int max>
int rand_int()
{
static std::uniform_int_distribution dist(min, max);
static std::mt19937 gen(std::random_device{}());
return dist(gen);
}
int main()
{
std::vector<int> v;
std::generate_n(std::back_inserter(v), 20, rand_int<-9, +9>);
std::cout << std::showpos;
println("Antes de ordenar: ", v);
selection_sort(v.begin(), v.end());
println("Después de ordenar: ", v);
}
Posible salida:
Antes de ordenar: -9 -3 +2 -8 +0 -1 +8 -4 -5 +1 -4 -5 +4 -9 -8 -6 -6 +8 -4 -6
Después de ordenar: -9 -9 -8 -8 -6 -6 -6 -5 -5 -4 -4 -4 -3 -1 +0 +1 +2 +4 +8 +8
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 187 | C++98 | No se especificaba si se usaba swap.
|
El efecto equivale a swap(*a, *b).
|
Véase también
| Intercambia los valores de dos objetos (plantilla de función) | |
| Intercambia dos rangos de elementos. (plantilla de función) | |
(C++20) |
Intercambia los objetos a los que apuntan dos iteradores subyacentes ajustados (plantilla de función) |
(C++20) |
Intercambia los objetos a los que apuntan dos iteradores subyacentes (plantilla de función) |
(C++20) |
Intercambia los valores referenciados por dos objetos desreferenciables. (objeto punto de personalización) |