Namespaces
Variants

iter_swap (std::common_iterator)

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
template < std:: indirectly_swappable < I > I2, class S2 >

friend constexpr void
iter_swap ( const common_iterator & x,

const std:: common_iterator < I2, S2 > & y ) noexcept ( /*ver más abajo*/ ) ;
(desde C++20)

Intercambia los objetos apuntados por dos iteradores subyacentes. El comportamiento es indefinido si x no contiene un objeto I o y no contiene un objeto I2 (es decir, al menos uno de x y y no contiene un iterador).

El cuerpo de la función es equivalente a ranges:: iter_swap ( std :: get < I > ( x. var ) , std :: get < I2 > ( y. var ) ) .

Esta plantilla de función no es visible para la búsqueda unqualified o qualified lookup ordinaria, y solo puede ser encontrada mediante argument-dependent lookup cuando std::common_iterator<I,S> es una clase asociada de los argumentos.

Contenidos

Parámetros

x, y - los iteradores a los elementos a intercambiar

Valor de retorno

(ninguno)

Complejidad

Constante.

Excepciones

noexcept especificación:
noexcept ( noexcept ( ranges:: iter_swap ( std:: declval < const I & > ( ) , std:: declval < const I2 & > ( ) ) ) )

Ejemplo

#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
int main()
{
    std::vector<std::string> v1{"1", "2", "3", "4", "5"},
                             v2{"α", "β", "γ", "δ", "ε"};
    using CI = std::common_iterator<
                   std::counted_iterator<std::vector<std::string>::iterator>,
                   std::default_sentinel_t
                   >;
    CI first1{std::counted_iterator{v1.begin(), 3}};
    CI first2{std::counted_iterator{v2.begin(), 4}};
    CI last{std::default_sentinel};
    auto print = [&](auto rem)
    {
        std::cout << rem << "v1 = ";
        std::ranges::copy(v1, std::ostream_iterator<std::string>{std::cout, " "});
        std::cout << "\nv2 = ";
        std::ranges::copy(v2, std::ostream_iterator<std::string>{std::cout, " "});
        std::cout << '\n';
    };
    print("Before iter_swap:\n");
    for (; first1 != last && first2 != last; ++first1, ++first2)
        iter_swap(first1, first2); // ADL
    print("After iter_swap:\n");
}

Salida:

Before iter_swap:
v1 = 1 2 3 4 5 
v2 = α β γ δ ε 
After iter_swap:
v1 = α β γ 4 5 
v2 = 1 2 3 δ ε

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 3574 C++20 variant era completamente constexpr (P2231R1) pero common_iterator no lo era también se hizo constexpr

Véase también

intercambia los valores de dos objetos
(plantilla de función)
intercambia dos rangos de elementos
(plantilla de función)
intercambia los elementos apuntados por dos iteradores
(plantilla de función)
(C++20)
intercambia los valores referenciados por dos objetos dereferenciables
(objeto de punto de personalización)
(C++20)
intercambia los objetos apuntados por dos iteradores subyacentes
(plantilla de función)