std::reverse_copy
| Definiert in Header <algorithm> |
||
| template< class BidirIt, class OutputIt > OutputIt reverse_copy( BidirIt first, BidirIt last, |
(1) | (constexpr seit C++20) |
| template< class ExecutionPolicy, class BidirIt, class ForwardIt > ForwardIt reverse_copy( ExecutionPolicy&& policy, |
(2) | (seit C++17) |
[first, last) (Quellbereich) in einen anderen Bereich von N Elementen, beginnend bei d_first (Zielbereich), so dass die Elemente im Zielbereich in umgekehrter Reihenfolge angeordnet sind.[0, N) ausgeführt würde.|
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) |
Inhalt |
[edit] Parameter
| first, last | - | das Iteratorpaar, das den Quell-Bereich der zu kopierenden Elemente definiert |
| d_first | - | der Anfang des Zielbereichs |
| Typanforderungen | ||
-BidirIt muss die Anforderungen von LegacyBidirectionalIterator erfüllen. | ||
-OutputIt muss die Anforderungen an LegacyOutputIterator erfüllen. | ||
-ForwardIt muss die Anforderungen von LegacyForwardIterator erfüllen. | ||
[edit] Rückgabewert
Ausgabe-Iterator auf das Element nach dem letzten kopierten Element.
[edit] Komplexität
Genau N 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
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.
[edit] Mögliche Implementierung
Siehe auch die Implementierungen in libstdc++, libc++ und MSVC STL.
template<class BidirIt, class OutputIt> constexpr // since C++20 OutputIt reverse_copy(BidirIt first, BidirIt last, OutputIt d_first) { for (; first != last; ++d_first) *d_first = *(--last); return d_first; } |
[edit] Hinweise
Implementierungen (z. B. MSVC STL) können Vektorisierung aktivieren, wenn beide Iteratortypen LegacyContiguousIterator erfüllen und denselben Werttyp haben, und der Werttyp TriviallyCopyable ist.
[edit] Beispiel
#include <algorithm> #include <iostream> #include <vector> int main() { auto print = [](const std::vector<int>& v) { for (const auto& value : v) std::cout << value << ' '; std::cout << '\n'; }; std::vector<int> v{1, 2, 3}; print(v); std::vector<int> destination(3); std::reverse_copy(std::begin(v), std::end(v), std::begin(destination)); print(destination); std::reverse_copy(std::rbegin(v), std::rend(v), std::begin(destination)); print(destination); }
Ausgabe
1 2 3 3 2 1 1 2 3
[edit] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 2074 | C++98 | für jedes i war die Zuweisung *(d_first + N - i) = *(first + i)[1] |
korrigiert zu *(d_first + N - 1 - i) = *(first + i)[1] |
| LWG 2150 | C++98 | nur ein Element musste zugewiesen werden | korrigierte die Anforderung |
- ↑ 1.0 1.1 1.2 LegacyOutputIterator muss binäres
+und-nicht unterstützen. Die Verwendungen von+und-hier sind nur zur Veranschaulichung: die tatsächliche Berechnung muss sie nicht verwenden.
[edit] Siehe auch
| Kehrt die Reihenfolge der Elemente in einem Bereich um (Funktionstemplate) | |
| (C++20) |
Erstellt eine Kopie eines Bereichs, der umgekehrt ist (Algorithmus-Funktionsobjekt) |