std::ranges:: move, std::ranges:: move_result
std::ranges
| Non-modifying sequence operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Modifying sequence operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Partitioning operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Sorting operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Binary search operations (on sorted ranges) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Set operations (on sorted ranges) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Heap operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Minimum/maximum operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Permutation operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Fold operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Operations on uninitialized storage | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Return types | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definiert in Header
<algorithm>
|
||
|
Aufrufsignatur
|
||
|
template
<
std::
input_iterator
I,
std::
sentinel_for
<
I
>
S,
std::
weakly_incrementable
O
>
requires
std::
indirectly_movable
<
I, O
>
|
(1) | (seit C++20) |
|
template
<
ranges::
input_range
R,
std::
weakly_incrementable
O
>
requires
std::
indirectly_movable
<
ranges::
iterator_t
<
R
>
, O
>
|
(2) | (seit C++20) |
|
Hilfstypen
|
||
|
template
<
class
I,
class
O
>
using move_result = ranges:: in_out_result < I, O > ; |
(3) | (seit C++20) |
[
first
,
last
)
definierten Bereich in einen anderen Bereich, der bei
result
beginnt.
Das Verhalten ist undefiniert, wenn
result
innerhalb des Bereichs
[
first
,
last
)
liegt. In einem solchen Fall kann stattdessen
ranges::move_backward
verwendet werden.
Die Elemente im moved-from Bereich enthalten weiterhin gültige Werte des entsprechenden Typs, aber nicht notwendigerweise dieselben Werte wie vor dem Verschieben.
Die auf dieser Seite beschriebenen funktionsähnlichen Entitäten sind Algorithm Function Objects (informell bekannt als Niebloids ), das heißt:
- Explizite Template-Argumentlisten können beim Aufruf keiner von ihnen angegeben werden.
- Keiner von ihnen ist sichtbar für argument-dependent lookup .
- Wenn einer von ihnen durch normal unqualified lookup als Name links vom Funktionsaufrufoperator gefunden wird, wird argument-dependent lookup unterdrückt.
Inhaltsverzeichnis |
Parameter
| first, last | - | das Iterator-Sentinel-Paar, das den Bereich der zu verschiebenden Elemente definiert |
| r | - | der Bereich der zu verschiebenden Elemente |
| result | - | der Anfang des Zielbereichs |
Rückgabewert
{ last, result + N } , wobei
Komplexität
Genau N Move-Zuweisungen.
Hinweise
Beim Verschieben überlappender Bereiche ist ranges::move geeignet, wenn nach links verschoben wird (Anfang des Zielbereichs liegt außerhalb des Quellbereichs), während ranges::move_backward geeignet ist, wenn nach rechts verschoben wird (Ende des Zielbereichs liegt außerhalb des Quellbereichs).
Mögliche Implementierung
struct move_fn { template<std::input_iterator I, std::sentinel_for<I> S, std::weakly_incrementable O> requires std::indirectly_movable<I, O> constexpr ranges::move_result<I, O> operator()(I first, S last, O result) const { for (; first != last; ++first, ++result) *result = ranges::iter_move(first); return {std::move(first), std::move(result)}; } template<ranges::input_range R, std::weakly_incrementable O> requires std::indirectly_movable<ranges::iterator_t<R>, O> constexpr ranges::move_result<ranges::borrowed_iterator_t<R>, O> operator()(R&& r, O result) const { return (*this)(ranges::begin(r), ranges::end(r), std::move(result)); } }; inline constexpr move_fn move {}; |
` und `` Tags wurde gemäß den Anweisungen nicht übersetzt, da es sich um C++-Code handelt. Die HTML-Struktur und Attribute wurden ebenfalls unverändert beibehalten.
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> using namespace std::literals::chrono_literals; void f(std::chrono::milliseconds n) { std::this_thread::sleep_for(n); std::cout << "thread with n=" << n.count() << "ms ended" << std::endl; } int main() { std::vector<std::jthread> v; v.emplace_back(f, 400ms); v.emplace_back(f, 600ms); v.emplace_back(f, 800ms); std::list<std::jthread> l; // std::ranges::copy() would not compile, because std::jthread is non-copyable std::ranges::move(v, std::back_inserter(l)); }
Ausgabe:
thread with n=400ms ended thread with n=600ms ended thread with n=800ms ended
Siehe auch
|
(C++20)
|
verschiebt einen Elementbereich in umgekehrter Reihenfolge an einen neuen Speicherort
(Algorithmus-Funktionsobjekt) |
|
(C++20)
(C++20)
|
kopiert einen Elementbereich an einen neuen Speicherort
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
kopiert einen Elementbereich in umgekehrter Reihenfolge
(Algorithmus-Funktionsobjekt) |
|
(C++11)
|
verschiebt einen Elementbereich an einen neuen Speicherort
(Funktionstemplate) |
|
(C++11)
|
konvertiert das Argument zu einem xvalue
(Funktionstemplate) |