Namensräume
Varianten
Aktionen

std::move_iterator

Von cppreference.com
< cpp‎ | iterator
 
 
Iterator-Bibliothek
Iterator-Konzepte
Iterator-Primitive
Algorithmus-Konzepte und Hilfsprogramme
Indirekte aufrufbare Konzepte
Gemeinsame Algorithmus-Anforderungen
(C++20)
(C++20)
(C++20)
Dienstprogramme
(C++20)
Iterator-Adapter
Bereichszugriff
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
 
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

Typ Definition
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
Zeiger Iter
Referenz
(bis C++20)
Typ Definition
iterator_type Iter
iterator_category
(bedingt vorhanden)
iterator_concept

std::input_iterator_tag

(bis C++23)
(seit C++23)
value_type std::iter_value_t<Iter>
difference_type std::iter_difference_t<Iter>
Zeiger Iter
Referenz std::iter_rvalue_reference_t<Iter>
(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) [edit]
weist einen anderen move_iterator zu
(öffentliche Memberfunktion) [edit]
greift auf den zugrundeliegenden Iterator zu
(öffentliche Memberfunktion) [edit]
greift auf das dereferenzierte Element zu
(öffentliche Memberfunktion) [edit]
greift per Index auf ein Element zu
(öffentliche Memberfunktion) [edit]
bewegt den move_iterator vorwärts oder rückwärts
(öffentliche Memberfunktion) [edit]

[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) [edit]
vergleicht den zugrundeliegenden Iterator und das zugrundeliegende Sentinel
(Funktionstemplate) [edit]
(C++11)
bewegt den Iterator vorwärts
(Funktionstemplate) [edit]
(C++11)
berechnet die Distanz zwischen zwei Iterator-Adaptoren
(Funktionstemplate) [edit]
berechnet die Distanz zwischen dem zugrundeliegenden Iterator und dem zugrundeliegenden Sentinel
(Funktionstemplate) [edit]
(C++20)
castet das Ergebnis der Dereferenzierung des zugrundeliegenden Iterators in seinen zugehörigen rvalue-Referenztyp
(Funktion) [edit]
(C++20)
tauscht die Objekte, auf die zwei zugrundeliegende Iteratoren zeigen
(Funktionstemplate) [edit]
erzeugt einen std::move_iterator vom Typ, der aus dem Argument abgeleitet wird
(Funktionsvorlage) [bearbeiten]

[edit] Hilfstemplates

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;
(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ückgeben
falls 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 wenn
std::iterator_traits<Iter>::iterator_category nicht definiert ist
iterator_category ist
in diesem Fall nicht definiert

[edit] Siehe auch

erzeugt einen std::move_iterator vom Typ, der aus dem Argument abgeleitet wird
(Funktionsvorlage) [bearbeiten]
Sentinel-Adaptor für std::move_iterator
(Klassenvorlage) [bearbeiten]