std::iter_swap
De es.cppreference.net
| Definido en el 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 dados.
Si se cumple alguna de las siguientes condiciones, el comportamiento no está definido:
aobno es desreferenciable.*ano es Swappable con*b.
Parámetros
| a, b | - | iteradores a los elementos a intercambiar |
| Requisitos de tipo | ||
-ForwardIt1, ForwardIt2 debe cumplir los requisitos de LegacyForwardIterator.
| ||
Valor de retorno
(ninguno)
Complejidad
Constante.
Notas
Esta plantilla de función modela la semántica de la operación de intercambio dada por Swappable. Es decir, se consideran las sobrecargas de swap encontradas por ADL y la alternativa de std::swap.
Posible implementación
template<class ForwardIt1, class ForwardIt2>
constexpr //< since C++20
void iter_swap(ForwardIt1 a, ForwardIt2 b)
{
using std::swap;
swap(*a, *b);
}
|
Ejemplo
La siguiente es una implementación de ordenamiento por selección en C++.
Ejecutar 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("Before sort: ", v);
selection_sort(v.begin(), v.end());
println("After sort: ", v);
}
Posible salida:
Before sort: -9 -3 +2 -8 +0 -1 +8 -4 -5 +1 -4 -5 +4 -9 -8 -6 -6 +8 -4 -6
After sort: -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 que cambian el comportamiento se aplicaron retroactivamente a los estándares C++ previamente publicados.
| DR | Aplicado a | Comportamiento como se publicó | Comportamiento correcto |
|---|---|---|---|
| LWG 187 | C++98 | no se especificaba si se usaba swap
|
el efecto es equivalente 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 & objeto de función de algoritmo) | |
(C++20) |
|
(C++20) |
intercambia los objetos apuntados por dos iteradores subyacentes ajustados (plantilla de función) |
(C++20) |
intercambia los objetos apuntados por dos iteradores subyacentes (plantilla de función) |
(C++20) |
intercambia los valores referenciados por dos objetos desreferenciables (objeto de punto de personalización) |