std::move_iterator
| Definiert in Header <iterator> |
||
| template< class Iter > class move_iterator; |
(seit C++11) | |
std::move_iterator ist ein Iterator-Adaptor, der sich exakt wie der zugrundeliegende Iterator verhält (der mindestens ein LegacyInputIterator oder ein input_iterator-Modell(seit C++20) oder ein stärkeres Iterator-Konzept(seit C++23) sein muss), mit der Ausnahme, dass Dereferenzierung den vom zugrundeliegenden Iterator zurückgegebenen Wert in einen rvalue konvertiert. Wenn dieser Iterator als Input-Iterator verwendet wird, hat dies zur Folge, dass die Werte verschoben (moved) und nicht kopiert werden.
Inhalt |
[edit] Verschachtelte Typen
|
(bis C++20) | ||||||||||||||||||||
|
(seit C++20) |
[edit] Datenmember
| Mitglied | Beschreibung |
Iter current |
der zugrundeliegende Iterator ((exposition-only member object*) |
[edit] Memberfunktionen
konstruiert einen neuen move_iterator(öffentliche Memberfunktion) | |
weist einen anderen move_iterator zu(öffentliche Memberfunktion) | |
| greift auf den zugrundeliegenden Iterator zu (öffentliche Memberfunktion) | |
| greift auf das dereferenzierte Element zu (öffentliche Memberfunktion) | |
| greift per Index auf ein Element zu (öffentliche Memberfunktion) | |
bewegt den move_iterator vorwärts oder rückwärts(öffentliche Memberfunktion) |
[edit] 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 (Funktionstemplate) |
| vergleicht den zugrundeliegenden Iterator und das zugrundeliegende Sentinel (Funktionstemplate) | |
| (C++11) |
bewegt den Iterator vorwärts (Funktionstemplate) |
| (C++11) |
berechnet die Distanz zwischen zwei Iterator-Adaptoren (Funktionstemplate) |
| berechnet die Distanz zwischen dem zugrundeliegenden Iterator und dem zugrundeliegenden Sentinel (Funktionstemplate) | |
| (C++20) |
castet das Ergebnis der Dereferenzierung des zugrundeliegenden Iterators in seinen zugehörigen rvalue-Referenztyp (Funktion) |
| (C++20) |
tauscht die Objekte, auf die zwei zugrundeliegende Iteratoren zeigen (Funktionstemplate) |
| (C++11) |
erzeugt einen std::move_iterator vom Typ, der aus dem Argument abgeleitet wird (Funktionsvorlage) |
[edit] Hilfstemplates
| template< class Iterator1, class Iterator2 > requires (!std::sized_sentinel_for<Iterator1, Iterator2>) |
(seit C++20) | |
Diese partielle Spezialisierung von std::disable_sized_sentinel_for verhindert, dass Spezialisierungen von move_iterator sized_sentinel_for erfüllen, wenn ihre zugrundeliegenden Iteratoren das Konzept nicht erfüllen.
[edit] Anmerkungen
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_move_iterator_concept |
202207L |
(C++23) | Machen Sie std::move_iterator<T*> zu einem Random-Access-Iterator |
[edit] 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"
[edit] 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 | das Dereferenzieren eines move_iterator könnte eine dangling reference zurückgebenfalls das Dereferenzieren des zugrundeliegenden Iterators einen prvalue zurückgibt |
gibt stattdessen das Objekt zurück |
| LWG 3736 | C++20 | move_iterator fehlte die disable_sized_sentinel_for-Spezialisierung |
hinzugefügt |
| P2259R1 | C++20 | der Member iterator_category wurde definiert, auch wennstd::iterator_traits<Iter>::iterator_category nicht definiert ist |
iterator_category istin diesem Fall nicht definiert |
[edit] Siehe auch
| (C++11) |
erzeugt einen std::move_iterator vom Typ, der aus dem Argument abgeleitet wird (Funktionsvorlage) |
| (C++20) |
Sentinel-Adaptor für std::move_iterator (Klassenvorlage) |