std::copy_backward
| Definiert in Header <algorithm> |
||
| template< class BidirIt1, class BidirIt2 > BidirIt2 copy_backward( BidirIt1 first, BidirIt1 last, BidirIt2 d_last ); |
(constexpr seit C++20) | |
Kopiert die Elemente aus dem Bereich [first, last) in einen anderen Bereich, der bei d_last endet. Die Elemente werden in umgekehrter Reihenfolge kopiert (das letzte Element wird zuerst kopiert), aber ihre relative Reihenfolge bleibt erhalten.
Das Verhalten ist undefiniert, wenn d_last innerhalb von (first, last] liegt. In diesem Fall muss std::copy anstelle von std::copy_backward verwendet werden.
Inhalt |
[bearbeiten] Parameter
| first, last | - | Das Iteratorenpaar, das den Quell-Bereich der zu kopierenden Elemente definiert |
| d_last | - | Das Ende des Zielbereichs |
| Typanforderungen | ||
-BidirIt muss die Anforderungen von LegacyBidirectionalIterator erfüllen. | ||
[bearbeiten] Rückgabewert
Iterator auf das zuletzt kopierte Element.
[bearbeiten] Komplexität
Genau std::distance(first, last) Zuweisungen.
[bearbeiten] Hinweise
Beim Kopieren überlappender Bereiche ist std::copy geeignet, wenn nach links kopiert wird (der Anfang des Zielbereichs liegt außerhalb des Quellbereichs), während std::copy_backward geeignet ist, wenn nach rechts kopiert wird (das Ende des Zielbereichs liegt außerhalb des Quellbereichs).
[bearbeiten] Mögliche Implementierung
template<class BidirIt1, class BidirIt2> BidirIt2 copy_backward(BidirIt1 first, BidirIt1 last, BidirIt2 d_last) { while (first != last) *(--d_last) = *(--last); return d_last; } |
[bearbeiten] Beispiel
#include <algorithm> #include <iostream> #include <numeric> #include <vector> int main() { std::vector<int> source(4); std::iota(source.begin(), source.end(), 1); // fills with 1, 2, 3, 4 std::vector<int> destination(6); std::copy_backward(source.begin(), source.end(), destination.end()); std::cout << "destination contains: "; for (auto i: destination) std::cout << i << ' '; std::cout << '\n'; }
Ausgabe
destination contains: 0 0 1 2 3 4
[bearbeiten] Defect Reports
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 1206 | C++98 | 1. Das Verhalten war definiert, wenn d_last == last 2. Das Verhalten war undefiniert, wenn d_last == first |
1. wurde als undefiniert markiert 2. wurde als definiert markiert |
[bearbeiten] Siehe auch
| (C++11) |
Kopiert einen Elementbereich an einen neuen Speicherort (Funktionstempelat) |
| (C++20) |
Kopiert einen Elementbereich in umgekehrter Reihenfolge (Algorithmus-Funktionsobjekt) |