Namespaces
Variants

std::ranges:: move, std::ranges:: move_result

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Constrained algorithms
All names in this menu belong to namespace 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 >
constexpr move_result < I, O >

move ( I first, S last, O result ) ;
(1) (seit C++20)
template < ranges:: input_range R, std:: weakly_incrementable O >

requires std:: indirectly_movable < ranges:: iterator_t < R > , O >
constexpr move_result < ranges:: borrowed_iterator_t < R > , O >

move ( R && r, O result ) ;
(2) (seit C++20)
Hilfstypen
template < class I, class O >
using move_result = ranges:: in_out_result < I, O > ;
(3) (seit C++20)
1) Verschiebt die Elemente im durch [ 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.
2) Gleich wie (1) , verwendet jedoch r als Quellbereich, als ob ranges:: begin ( r ) als first und ranges:: end ( r ) als last verwendet würde.

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:

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

1) N = ranges:: distance ( first, last ) .
2) N = ranges:: distance ( r ) .

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 {};
**Hinweis:** Der gesamte Code innerhalb der `
` 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

verschiebt einen Elementbereich in umgekehrter Reihenfolge an einen neuen Speicherort
(Algorithmus-Funktionsobjekt)
kopiert einen Elementbereich an einen neuen Speicherort
(Algorithmus-Funktionsobjekt)
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)