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 ( /*voir ci-dessous*/ ) ;
(depuis C++20)

Échange les objets pointés par deux itérateurs sous-jacents. Le comportement est indéfini si x ne contient pas un objet I ou si y ne contient pas un objet I2 (c'est-à-dire qu'au moins l'un des x et y ne contient pas d'itérateur).

Le corps de la fonction est équivalent à ranges:: iter_swap ( std :: get < I > ( x. var ) , std :: get < I2 > ( y. var ) ) .

Ce modèle de fonction n'est pas visible par la recherche non qualifiée ou la recherche qualifiée ordinaires, et ne peut être trouvé que par la recherche dépendante des arguments lorsque std::common_iterator<I,S> est une classe associée des arguments.

Table des matières

Paramètres

x, y - les itérateurs vers les éléments à échanger

Valeur de retour

(aucun)

Complexité

Constante.

Exceptions

noexcept spécification :
noexcept ( noexcept ( ranges:: iter_swap ( std:: declval < const I & > ( ) , std:: declval < const I2 & > ( ) ) ) )

Exemple

#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");
}

Sortie :

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

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR S'applique à Comportement publié Comportement corrigé
LWG 3574 C++20 variant était entièrement constexpr (P2231R1) mais common_iterator ne l'était pas également rendu constexpr

Voir aussi

échange les valeurs de deux objets
(modèle de fonction)
échange deux plages d'éléments
(modèle de fonction)
échange les éléments pointés par deux itérateurs
(modèle de fonction)
(C++20)
échange les valeurs référencées par deux objets déréférençables
(point de personnalisation)
(C++20)
échange les objets pointés par deux itérateurs sous-jacents
(modèle de fonction)