std:: move_iterator
|
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
|
(jusqu'en C++20) | ||||||||||||||||||||
|
(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) |
|
(C++20)
|
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) |
|
(C++20)
|
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) |
|
(C++11)
|
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
>
)
|
(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
|
(C++11)
|
crée un
std::move_iterator
dont le type est déduit de l'argument
(modèle de fonction) |
|
(C++20)
|
adaptateur de sentinelle pour
std::move_iterator
(modèle de classe) |