Espacios de nombres
Variantes
Acciones

std::ranges::swap_ranges, std::ranges::swap_ranges_result

De cppreference.com
< cpp‎ | algorithm‎ | ranges
 
 
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
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
 
Algoritmos restringidos
Operaciones de secuencia no modificantes
Operaciones de secuencia modificantes
Operaciones en almacenamiento sin inicializar
Operaciones de partición
Operaciones de ordenamiento
Operaciones de búsqueda binaria
Operaciones de conjuntos (en rangos ordenados)
Operaciones de montículo/montón
Operaciones de mínimo/máximo
Permutaciones
 
Definido en el archivo de encabezado <algorithm>
Signatura de la llamada
template<std::input_iterator I1, std::sentinel_for<I1> S1,

          std::input_iterator I2, std::sentinel_for<I2> S2 >
requires std::indirectly_swappable<I1, I2>
constexpr swap_ranges_result<I1, I2>

    swap_ranges( I1 first1, S1 last1, I2 first2, S2 last2 );
(1) (desde C++20)
template<ranges::input_range R1, ranges::input_range R2 >

requires std::indirectly_swappable<ranges::iterator_t<R1>, ranges::iterator_t<R2>>
constexpr swap_ranges_result<ranges::borrowed_iterator_t<R1>,
                             ranges::borrowed_iterator_t<R2>>

    swap_ranges( R1&& r1, R2&& r2 );
(2) (desde C++20)
Tipos auxiliares
template<class I1, class I2 >
using swap_ranges_result =ranges::in_in_result<I1, I2>;
(3) (desde C++20)
1) Intercambia elementos entre el primer rango [first1first1 + M) y el segundo rango [first2first2 + M) via ranges::iter_swap(first1 + i, first2 + i), donde M =ranges::min(ranges::distance(first1, last1), ranges::distance(first2, last2)).
Los rangos [first1last1) y [first2last2) no deben superponerse.
2) Igual que (1), pero usa r1 como el primer rango y r2 como el segundo rango, como si se usara ranges::begin(r1) como first1, ranges::end(r1) como last1, ranges::begin(r2) como first2, y ranges::end(r2) como last2.

Las entidades similares a funciones descritas en esta página son niebloids, es decir:

En la práctica, pueden implementarse como objetos función o con extensiones de compilador especiales.

Contenido

[editar]Parámetros

first1, last1 - El primer rango de elementos a intercambiar.
first2, last2 - El segundo rango de elementos a intercambiar.
r1 - El primer rango de elementos a intercambiar.
r2 - El segundo rango de elementos a intercambiar.

[editar]Valor de retorno

{first1 + M, first2 + M}.

[editar]Complejidad

Exactamente M intercambios.

[editar]Notas

Las implementaciones (p. ej., MSVC STL) pueden habilitar la vectorización cuando el tipo iterador modela contiguous_iterator y el intercambio de su tipo valor no llama a una función miembro especial no trivial ni a swap hallada por la búsqueda dependiente de argumento.

[editar]Possible implementation

struct swap_ranges_fn {template<std::input_iterator I1, std::sentinel_for<I1> S1, std::input_iterator I2, std::sentinel_for<I2> S2> requires std::indirectly_swappable<I1, I2>constexpr ranges::swap_ranges_result<I1, I2> operator()(I1 first1, S1 last1, I2 first2, S2 last2)const{for(;!(first1 == last1 or first2 == last2);++first1, ++first2)ranges::iter_swap(first1, first2);return{std::move(first1), std::move(first2)};}   template<ranges::input_range R1, ranges::input_range R2> requires std::indirectly_swappable<ranges::iterator_t<R1>, ranges::iterator_t<R2>>constexpr ranges::swap_ranges_result<ranges::borrowed_iterator_t<R1>, ranges::borrowed_iterator_t<R2>> operator()(R1&& r1, R2&& r2)const{return(*this)(ranges::begin(r1), ranges::end(r1), ranges::begin(r2), ranges::end(r2));}};   inlineconstexpr swap_ranges_fn swap_ranges {};

[editar]Ejemplo

#include <algorithm>#include <iostream>#include <list>#include <string_view>#include <vector>   auto print(std::string_view name, autoconst& seq, std::string_view term ="\n"){std::cout<< name <<" : ";for(constauto& elem : seq)std::cout<< elem <<' ';std::cout<< term;}   int main(){std::vector<char> p {'A', 'B', 'C', 'D', 'E'};std::list<char> q {'1', '2', '3', '4', '5', '6'};   print("p", p); print("q", q, "\n\n");   // intercambiar p[0, 2) y q[1, 3): std::ranges::swap_ranges(p.begin(), p.begin()+4, std::ranges::next(q.begin(), 1), std::ranges::next(q.begin(), 3)); print("p", p); print("q", q, "\n\n");   // intercambiar p[0, 5) y q[0, 5): std::ranges::swap_ranges(p, q);   print("p", p); print("q", q);}

Salida:

p : A B C D E q : 1 2 3 4 5 6   p : 2 3 C D E q : 1 A B 4 5 6   p : 1 A B 4 5 q : 2 3 C D E 6

[editar]Véase también

(C++20)
Intercambia los valores referenciados por dos objetos desreferenciables.
(objeto punto de personalización)[editar]
Intercambia los valores de dos objetos.
(objeto punto de personalización)[editar]
Intercambia dos rangos de elementos.
(plantilla de función)[editar]
Intercambia los elementos a los que apuntan dos iteradores
(plantilla de función)[editar]
Intercambia los valores de dos objetos
(plantilla de función)[editar]
close