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)
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

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
pointer Iter
reference
(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 >
pointer Iter
reference std:: iter_rvalue_reference_t < Iter >
(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)
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)
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)
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 > )
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 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

erstellt einen std::move_iterator mit vom Argument abgeleitetem Typ
(Funktions-Template)
Sentinel-Adapter für std::move_iterator
(Klassen-Template)