Namensräume
Varianten
Aktionen

std::rotate_copy

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)
(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 ForwardIt, class OutputIt >

OutputIt rotate_copy( ForwardIt first, ForwardIt middle,

                      ForwardIt last, OutputIt d_first );
(1) (constexpr seit C++20)
template< class ExecutionPolicy,

          class ForwardIt1, class ForwardIt2 >
ForwardIt2 rotate_copy( ExecutionPolicy&& policy,
                        ForwardIt1 first, ForwardIt1 middle,

                        ForwardIt1 last, ForwardIt2 d_first );
(2) (seit C++17)

Kopiert die *Linksrotation* von [firstlast) nach d_first.

1) Kopiert die Elemente aus dem Bereich [firstlast) so, dass im Zielbereich beginnend bei d_first die Elemente in [firstmiddle) nach den Elementen in [middlelast) platziert werden, während die Reihenfolge der Elemente in beiden Bereichen erhalten bleibt.
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 eine der folgenden Bedingungen erfüllt ist, ist das Verhalten undefiniert

  • [firstmiddle) oder [middlelast) ist kein gültiger Bereich.
  • Die Quell- und Zielbereiche dürfen sich überlappen.

Inhalt

[edit] Parameter

first, last - das Iteratorpaar, das den Quell-Bereich der zu kopierenden Elemente definiert
middle - Ein Iterator auf ein Element in [firstlast), das am Anfang des neuen Bereichs stehen soll.
d_first - Anfang des Zielbereichs.
policy - die Ausführungsrichtlinie, die verwendet werden soll
Typanforderungen
-
ForwardIt, ForwardIt1, ForwardIt2 müssen die Anforderungen eines LegacyForwardIterator erfüllen.
-
OutputIt muss die Anforderungen an LegacyOutputIterator erfüllen.

[edit] Rückgabewert

Ein Output-Iterator auf das Element nach dem letzten kopierten Element.

[edit] Komplexität

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

[edit] 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.

[edit] Mögliche Implementierung

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

template<class ForwardIt, class OutputIt>
constexpr // since C++20
OutputIt rotate_copy(ForwardIt first, ForwardIt middle,
                     ForwardIt last, OutputIt d_first)
{
    d_first = std::copy(middle, last, d_first);
    return std::copy(first, middle, d_first);
}

[edit] Beispiel

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
 
int main()
{
    std::vector<int> src{1, 2, 3, 4, 5};
    std::vector<int> dest(src.size());
    auto pivot = std::find(src.begin(), src.end(), 3);
 
    std::rotate_copy(src.begin(), pivot, src.end(), dest.begin());
    for (int i : dest)
        std::cout << i << ' ';
    std::cout << '\n';
 
    // copy the rotation result directly to the std::cout
    pivot = std::find(dest.begin(), dest.end(), 1);
    std::rotate_copy(dest.begin(), pivot, dest.end(),
                     std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
}

Ausgabe

3 4 5 1 2
1 2 3 4 5

[edit] Siehe auch

Rotiert die Reihenfolge der Elemente in einem Bereich
(Funktionstemplate) [edit]
Kopiert und rotiert einen Bereich von Elementen
(Algorithmus-Funktionsobjekt)[edit]