Namespaces
Variants

std::iter_swap

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, p.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)

Operaciones de ordenamiento y relacionadas
Operaciones de particionamiento
(C++11)    

Operaciones de ordenamiento
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjunto (en rangos ordenados)
Operaciones de mezcla (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>
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:

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++.

#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)
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)