Namespaces
Variants

std:: move_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)
Défini dans l'en-tête <iterator>
template < class Iter >
class move_iterator ;
(depuis C++11)

std::move_iterator est un adaptateur d'itérateur qui se comporte exactement comme l'itérateur sous-jacent (qui doit être au moins un LegacyInputIterator ou modéliser input_iterator (depuis C++20) , ou un concept d'itérateur plus fort (depuis C++23) ), sauf que le déréférencement convertit la valeur retournée par l'itérateur sous-jacent en une rvalue. Si cet itérateur est utilisé comme un itérateur d'entrée, l'effet est que les valeurs sont déplacées plutôt que copiées.

Table des matières

Types imbriqués

Type Définition
iterator_type Iter
iterator_category std:: iterator_traits < Iter > :: iterator_category
value_type std:: iterator_traits < Iter > :: value_type
difference_type std:: iterator_traits < Iter > :: difference_type
pointer Iter
reference
(jusqu'en C++20)
Type Définition
iterator_type Iter
iterator_category
(conditionnellement présent)
iterator_concept

std::input_iterator_tag

(jusqu'en C++23)
(depuis C++23)
value_type std:: iter_value_t < Iter >
difference_type std:: iter_difference_t < Iter >
pointer Iter
reference std:: iter_rvalue_reference_t < Iter >
(depuis C++20)

Membres de données

Membre Description
Iter current l'itérateur sous-jacent
( objet membre d'exposition uniquement* )

Fonctions membres

construit un nouveau move_iterator
(fonction membre publique)
assigne un autre move_iterator
(fonction membre publique)
accède à l'itérateur sous-jacent
(fonction membre publique)
accède à l'élément pointé
(fonction membre publique)
accède à un élément par index
(fonction membre publique)
avance ou décrémente le move_iterator
(fonction membre publique)

Fonctions non membres

(C++11) (C++11) (supprimé en C++20) (C++11) (C++11) (C++11) (C++11) (C++20)
compare les itérateurs sous-jacents
(modèle de fonction)
compare l'itérateur sous-jacent et la sentinelle sous-jacente
(modèle de fonction)
(C++11)
avance l'itérateur
(modèle de fonction)
(C++11)
calcule la distance entre deux adaptateurs d'itérateur
(modèle de fonction)
calcule la distance entre l'itérateur sous-jacent et la sentinelle sous-jacente
(modèle de fonction)
(C++20)
convertit le résultat du déréférencement de l'itérateur sous-jacent en son type de référence rvalue associé
(fonction)
(C++20)
échange les objets pointés par deux itérateurs sous-jacents
(modèle de fonction)
crée un std::move_iterator dont le type est déduit de l'argument
(modèle de fonction)

Modèles d'assistance

template < class Iterator1, class Iterator2 >

requires ( ! std:: sized_sentinel_for < Iterator1, Iterator2 > )
constexpr bool disable_sized_sentinel_for

< std :: move_iterator < Iterator1 > , std :: move_iterator < Iterator2 >> = true ;
(depuis C++20)

Cette spécialisation partielle de std::disable_sized_sentinel_for empêche les spécialisations de move_iterator de satisfaire sized_sentinel_for si leurs itérateurs sous-jacents ne satisfont pas le concept.

Notes

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_move_iterator_concept 202207L (C++23) Faire de std :: move_iterator < T * > un itérateur à accès aléatoire

Exemple

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <ranges>
#include <string>
#include <string_view>
#include <vector>
void print(const std::string_view rem, const auto& v)
{
    std::cout << rem;
    for (const auto& s : v)
        std::cout << std::quoted(s) << ' ';
    std::cout << '\n';
};
int main()
{
    std::vector<std::string> v{"this", "_", "is", "_", "an", "_", "example"};
    print("Old contents of the vector: ", v);
    std::string concat;
    for (auto begin = std::make_move_iterator(v.begin()),
              end = std::make_move_iterator(v.end());
         begin != end; ++begin)
    {
        std::string temp{*begin}; // moves the contents of *begin to temp
        concat += temp;
    }
    // Starting from C++17, which introduced class template argument deduction,
    // the constructor of std::move_iterator can be used directly:
    // std::string concat = std::accumulate(std::move_iterator(v.begin()),
    //                                      std::move_iterator(v.end()),
    //                                      std::string());
    print("New contents of the vector: ", v);
    print("Concatenated as string: ", std::ranges::single_view(concat));
}

Sortie possible :

Old contents of the vector: "this" "_" "is" "_" "an" "_" "example"
New contents of the vector: "" "" "" "" "" "" ""
Concatenated as string: "this_is_an_example"

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 Appliqué à Comportement publié Comportement corrigé
LWG 2106 C++11 déréférencer un move_iterator pouvait retourner une référence pendante
si le déréférencement de l'itérateur sous-jacent retournait une prvalue
retourne
l'objet à la place
LWG 3736 C++20 move_iterator manquait la spécialisation disable_sized_sentinel_for ajoutée
P2259R1 C++20 le membre iterator_category était défini même si
std:: iterator_traits < Iter > :: iterator_category n'est pas défini
iterator_category n'est
pas défini dans ce cas

Voir aussi

crée un std::move_iterator dont le type est déduit de l'argument
(modèle de fonction)
adaptateur de sentinelle pour std::move_iterator
(modèle de classe)