std:: move_iterator
|
Definiert im Header
<iterator>
|
||
|
template
<
class
Iter
>
class move_iterator ; |
(seit C++11) | |
std::move_iterator
ist ein Iterator-Adapter, der sich genau wie der zugrundeliegende Iterator verhält (welcher mindestens ein
LegacyInputIterator
oder das Konzept
input_iterator
modelliert
(seit C++20)
oder ein stärkeres Iterator-Konzept sein muss
(seit C++23)
), mit der Ausnahme, dass die Dereferenzierung den vom zugrundeliegenden Iterator zurückgegebenen Wert in einen Rvalue umwandelt. Wenn dieser Iterator als Eingabeiterator verwendet wird, hat dies zur Folge, dass die Werte verschoben statt kopiert werden.
Inhaltsverzeichnis |
Verschachtelte Typen
|
(bis C++20) | ||||||||||||||||||||
|
(seit C++20) |
Datenmitglieder
| Mitglied | Beschreibung |
Iter
current
|
der zugrundeliegende Iterator
( Nur zur Veranschaulichung (exposition-only member object*) ) |
Memberfunktionen
konstruiert einen neuen
move_iterator
(öffentliche Elementfunktion) |
|
weist einen anderen
move_iterator
zu
(öffentliche Elementfunktion) |
|
|
greift auf den zugrunde liegenden Iterator zu
(öffentliche Elementfunktion) |
|
|
greift auf das referenzierte Element zu
(öffentliche Elementfunktion) |
|
|
greift auf ein Element per Index zu
(öffentliche Elementfunktion) |
|
erhöht oder verringert den
move_iterator
(öffentliche Elementfunktion) |
Nicht-Member-Funktionen
|
(C++11)
(C++11)
(entfernt in C++20)
(C++11)
(C++11)
(C++11)
(C++11)
(C++20)
|
vergleicht die zugrundeliegenden Iteratoren
(Funktions-Template) |
|
(C++20)
|
vergleicht den zugrundeliegenden Iterator und den zugrundeliegenden Sentinel
(Funktions-Template) |
|
(C++11)
|
bewegt den Iterator vorwärts
(Funktions-Template) |
|
(C++11)
|
berechnet die Distanz zwischen zwei Iterator-Adaptoren
(Funktions-Template) |
|
(C++20)
|
berechnet die Distanz zwischen dem zugrundeliegenden Iterator und dem zugrundeliegenden Sentinel
(Funktions-Template) |
|
(C++20)
|
konvertiert das Ergebnis der Dereferenzierung des zugrundeliegenden Iterators in seinen zugehörigen Rvalue-Referenz-Typ
(Funktion) |
|
(C++20)
|
vertauscht die Objekte, auf die zwei zugrundeliegende Iteratoren zeigen
(Funktions-Template) |
|
(C++11)
|
erstellt einen
std::move_iterator
mit vom Argument abgeleitetem Typ
(Funktions-Template) |
Hilfsvorlagen
|
template
<
class
Iterator1,
class
Iterator2
>
erfordert
(
!
std::
sized_sentinel_for
<
Iterator1, Iterator2
>
)
|
(seit C++20) | |
Diese partielle Spezialisierung von
std::disable_sized_sentinel_for
verhindert, dass Spezialisierungen von
move_iterator
das Konzept
sized_sentinel_for
erfüllen, wenn ihre zugrunde liegenden Iteratoren das Konzept nicht erfüllen.
Hinweise
| Feature-Test Makro | Wert | Std | Funktion |
|---|---|---|---|
__cpp_lib_move_iterator_concept
|
202207L
|
(C++23) | Mache std :: move_iterator < T * > einen wahlfreien Zugriffsiterator |
Beispiel
#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)); }
Mögliche Ausgabe:
Old contents of the vector: "this" "_" "is" "_" "an" "_" "example" New contents of the vector: "" "" "" "" "" "" "" Concatenated as string: "this_is_an_example"
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 2106 | C++11 |
Dereferenzierung eines
move_iterator
könnte eine hängende Referenz zurückgeben
falls die Dereferenzierung des zugrundeliegenden Iterators einen Prvalue zurückgibt |
gibt das
Objekt stattdessen zurück |
| LWG 3736 | C++20 |
move_iterator
fehlte
disable_sized_sentinel_for
Spezialisierung
|
hinzugefügt |
| P2259R1 | C++20 |
Mitglied
iterator_category
war definiert selbst wenn
std:: iterator_traits < Iter > :: iterator_category nicht definiert ist |
iterator_category
ist
in diesem Fall nicht definiert |
Siehe auch
|
(C++11)
|
erstellt einen
std::move_iterator
mit vom Argument abgeleitetem Typ
(Funktions-Template) |
|
(C++20)
|
Sentinel-Adapter für
std::move_iterator
(Klassen-Template) |