Namensräume
Varianten
Aktionen

std::move

Von cppreference.com
< cpp‎ | algorithm
 
 
Algorithmenbibliothek
Beschränkte Algorithmen und Algorithmen für Bereiche (C++20)
Beschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Ausführungsrichtlinien (C++17)
Nicht-modifizierende Sequenzoperationen
Stapeloperationen
(C++17)
Suchoperationen
(C++11)                (C++11)(C++11)

Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
move
(C++11)
Tauschoperationen
Transformationsoperationen
Generierungsoperationen
Entfernungsoperationen
Ordnungsändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Zusammenführungsoperationen (auf sortierten Bereichen)
Heapoperationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikographische Vergleichsoperationen
Permutationsoperationen
C-Bibliothek
Numerische Operationen
Operationen auf uninitialisiertem Speicher
 
Definiert in Header <algorithm>
template< class InputIt, class OutputIt >

OutputIt move( InputIt first, InputIt last,

               OutputIt d_first );
(1) (seit C++11)
(constexpr seit C++20)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >

ForwardIt2 move( ExecutionPolicy&& policy,
                 ForwardIt1 first, ForwardIt1 last,

                 ForwardIt2 d_first );
(2) (seit C++17)
1) Verschiebt die Elemente im Bereich [firstlast) in einen anderen Bereich, der bei d_first beginnt. Dies geschieht beginnend bei first und fortschreitend bis last. Nach dieser Operation enthalten die Elemente im verschobenen Bereich immer noch gültige Werte des entsprechenden Typs, aber nicht notwendigerweise die gleichen Werte wie vor dem Verschieben.
2) Wie (1), wird aber gemäß policy ausgeführt.
Diese Überladung nimmt an der Überladungsauflösung teil, nur wenn alle folgenden Bedingungen erfüllt sind

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> ist true.

(bis C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> ist true.

(seit C++20)

Wenn d_first innerhalb des Bereichs [firstlast) liegt, ist das Verhalten undefiniert. In diesem Fall kann stattdessen std::move_backward verwendet werden.

Inhalt

[bearbeiten] Parameter

first, last - das Iteratorenpaar, das den Quell-Bereich der zu verschiebenden Elemente definiert
d_first - der Anfang des Zielbereichs
policy - die Ausführungsrichtlinie, die verwendet werden soll
Typanforderungen
-
InputIt muss die Anforderungen von LegacyInputIterator erfüllen.
-
OutputIt muss die Anforderungen an LegacyOutputIterator erfüllen.
-
ForwardIt1, ForwardIt2 müssen die Anforderungen an LegacyForwardIterator erfüllen.

[bearbeiten] Rückgabewert

Der Iterator auf das Element nach dem letzten verschobenen Element.

[bearbeiten] Komplexität

Genau std::distance(first, last) Zuweisungen durch Verschieben.

[bearbeiten] Ausnahmen

Die Überladung mit einem Template-Parameter namens ExecutionPolicy meldet Fehler wie folgt

  • Wenn die Ausführung einer Funktion, die als Teil des Algorithmus aufgerufen wird, eine Ausnahme auslöst und ExecutionPolicy eine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsabhängig.
  • Wenn dem Algorithmus der Speicher zur Neuzuweisung fehlt, wird std::bad_alloc ausgelöst.

[bearbeiten] Mögliche Implementierung

template<class InputIt, class OutputIt>
OutputIt move(InputIt first, InputIt last, OutputIt d_first)
{
    for (; first != last; ++d_first, ++first)
        *d_first = std::move(*first);
 
    return d_first;
}

[bearbeiten] Hinweise

Beim Verschieben überlappender Bereiche ist std::move geeignet, wenn nach links verschoben wird (der Anfang des Zielbereichs liegt außerhalb des Quellbereichs), während std::move_backward geeignet ist, wenn nach rechts verschoben wird (das Ende des Zielbereichs liegt außerhalb des Quellbereichs).

[bearbeiten] Beispiel

Der folgende Code verschiebt Thread-Objekte (die selbst nicht kopierbar sind) von einem Container in einen anderen.

#include <algorithm>
#include <chrono>
#include <iostream>
#include <iterator>
#include <list>
#include <thread>
#include <vector>
 
void f(int n)
{
    std::this_thread::sleep_for(std::chrono::seconds(n));
    std::cout << "thread " << n << " ended" << std::endl;
}
 
int main()
{
    std::vector<std::jthread> v;
    v.emplace_back(f, 1);
    v.emplace_back(f, 2);
    v.emplace_back(f, 3);
    std::list<std::jthread> l;
 
    // copy() would not compile, because std::jthread is noncopyable
    std::move(v.begin(), v.end(), std::back_inserter(l));
}

Ausgabe

thread 1 ended
thread 2 ended
thread 3 ended

[bearbeiten] Siehe auch

Verschiebt einen Elementbereich in umgekehrter Reihenfolge an einen neuen Speicherort
(Funktionstempelat) [edit]
(C++11)
konvertiert das Argument in ein xvalue
(Funktionsvorlage) [edit]
Verschiebt einen Elementbereich an einen neuen Speicherort
(Algorithmus-Funktionsobjekt)[edit]