Namensräume
Varianten
Aktionen

std::ranges::reverse_copy, std::ranges::reverse_copy_result

Von cppreference.com
< cpp‎ | algorithm‎ | ranges
 
 
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)
(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
 
Eingeschränkte Algorithmen
Alle Namen in diesem Menü gehören zum Namespace std::ranges
Nicht-modifizierende Sequenzoperationen
Modifizierende Sequenzoperationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen (auf sortierten Bereichen)
       
       
Mengenoperationen (auf sortierten Bereichen)
Heapoperationen
Minimum/Maximum-Operationen
       
       
Permutationsoperationen
Faltoperationen
Operationen auf uninitialisiertem Speicher
Rückgabetypen
 
Definiert in Header <algorithm>
Aufruf-Signatur
template< std::bidirectional_iterator I, std::sentinel_for<I> S,

          std::weakly_incrementable O >
requires std::indirectly_copyable<I, O>
constexpr reverse_copy_result<I, O>

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

requires std::indirectly_copyable<ranges::iterator_t<R>, O>
constexpr reverse_copy_result<ranges::borrowed_iterator_t<R>, O>

    reverse_copy( R&& r, O result );
(2) (seit C++20)
Hilfstypen
template< class I, class O >
using reverse_copy_result = ranges::in_out_result<I, O>;
(3) (seit C++20)
1) Kopiert die Elemente aus dem Quellbereich [firstlast) in den Zielbereich [resultresult + N), wobei N gleich ranges::distance(first, last) ist, so dass die Elemente im neuen Bereich in umgekehrter Reihenfolge angeordnet sind. Verhält sich so, als ob die Zuweisung *(result + N - 1 - i) = *(first + i) für jede ganze Zahl i in [0N) ausgeführt würde. Das Verhalten ist undefiniert, wenn sich die Quell- und Zielbereiche überschneiden.
2) Dasselbe wie (1), aber verwendet r als Quellbereich, als ob ranges::begin(r) als first und ranges::end(r) als last verwendet würden.

Die auf dieser Seite beschriebenen funktionsähnlichen Entitäten sind Algorithmus-Funktionsobjekte (informell als niebloids bekannt), d.h.

Inhalt

[edit] Parameter

first, last - das Iterator-Sentinel-Paar, das den Quellbereich Bereich der zu kopierenden Elemente definiert
r - der Quellbereich der zu kopierenden Elemente
Ergebnis - der Anfang des Zielbereichs.

[edit] Rückgabewert

{last, result + N}.

[edit] Komplexität

Genau N Zuweisungen.

[edit] Hinweise

Implementierungen (z. B. MSVC STL) können Vektorisierung aktivieren, wenn beide Iteratortypen contiguous_iterator modellieren, den gleichen Wertetyp haben und der Wertetyp TriviallyCopyable ist.

[edit] Mögliche Implementierung

Siehe auch die Implementierungen in MSVC STL und libstdc++.

struct reverse_copy_fn
{
    template<std::bidirectional_iterator I, std::sentinel_for<I> S,
             std::weakly_incrementable O>
    requires std::indirectly_copyable<I, O>
    constexpr ranges::reverse_copy_result<I, O>
        operator()(I first, S last, O result) const
    {
        auto ret = ranges::next(first, last);
        for (; last != first; *result = *--last, ++result);
        return {std::move(ret), std::move(result)};
    }
 
    template<ranges::bidirectional_range R, std::weakly_incrementable O>
    requires std::indirectly_copyable<ranges::iterator_t<R>, O>
    constexpr ranges::reverse_copy_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 reverse_copy_fn reverse_copy {};

[edit] Beispiel

#include <algorithm>
#include <iostream>
#include <string>
 
int main()
{
    std::string x {"12345"}, y(x.size(), ' ');
    std::cout << x << " → ";
    std::ranges::reverse_copy(x.begin(), x.end(), y.begin());
    std::cout << y << " → ";
    std::ranges::reverse_copy(y, x.begin());
    std::cout << x << '\n';
}

Ausgabe

12345 → 54321 → 12345

[edit] Siehe auch

Kehrt die Reihenfolge der Elemente in einem Bereich um
(Algorithmus-Funktionsobjekt)[edit]
Erstellt eine Kopie eines Bereichs, der umgekehrt ist
(Funktionstemplate) [edit]