std::move
| Definiert in Header <algorithm> |
||
| template< class InputIt, class OutputIt > OutputIt move( InputIt first, InputIt last, |
(1) | (seit C++11) (constexpr seit C++20) |
| template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 > ForwardIt2 move( ExecutionPolicy&& policy, |
(2) | (seit C++17) |
[first, last) 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.|
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 [first, last) 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
ExecutionPolicyeine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andereExecutionPolicyist 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
| (C++11) |
Verschiebt einen Elementbereich in umgekehrter Reihenfolge an einen neuen Speicherort (Funktionstempelat) |
| (C++11) |
konvertiert das Argument in ein xvalue (Funktionsvorlage) |
| (C++20) |
Verschiebt einen Elementbereich an einen neuen Speicherort (Algorithmus-Funktionsobjekt) |