std::unique_copy
| Definiert in Header <algorithm>
|
||
template< class InputIt, class OutputIt >
OutputIt unique_copy( InputIt first, InputIt last, OutputIt d_first );
|
(1) | (constexpr seit C++20) |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt2 unique_copy( ExecutionPolicy&& policy, ForwardIt1 first,
ForwardIt1 last, ForwardIt2 d_first );
|
(2) | (seit C++17) |
template< class InputIt, class OutputIt, class BinaryPred >
OutputIt unique_copy( InputIt first, InputIt last,
OutputIt d_first, BinaryPred p );
|
(3) | (constexpr seit C++20) |
template< class ExecutionPolicy, class ForwardIt1,
class ForwardIt2, class BinaryPred >
ForwardIt2 unique_copy( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 last,
ForwardIt2 d_first, BinaryPred p );
|
(4) | (seit C++17) |
Kopiert die Elemente aus dem Bereich [first, last), beginnend an d_first in einen anderen Bereich, so dass keine aufeinanderfolgenden gleichen Elemente vorhanden sind. Nur das erste Element jeder Gruppe gleicher Elemente wird kopiert.
operator== verglichen.operator== keine Äquivalenzrelation herstellt, ist das Verhalten undefiniert.p verglichen.p keine Äquivalenzrelation herstellt, ist das Verhalten undefiniert.policy.true ist:
|
|
(bis C++20) |
|
|
(seit C++20) |
Wenn *d_first = *first ungültig ist(bis C++20)*first nicht beschreibbar in d_first(seit C++20) ist, ist das Programm fehlerhaft.
Wenn sich Quell- und Zielbereiche überschneiden, ist das Verhalten undefiniert.
Gegeben T als Werttyp von InputIt, wenn Überladung (1) oder (3) nicht alle der folgenden Bedingungen erfüllt, ist das Verhalten undefiniert:
nicht
|
(bis C++20) |
|
(seit C++20) |
Tist sowohl CopyConstructible als auch CopyAssignable.- Alle folgenden Bedingungen sind erfüllt:
OutputIterfüllt die Anforderungen von LegacyForwardIterator.- Der Werttyp von
OutputItist ebenfallsT. Tist CopyAssignable.
Parameter
| first, last | - | das Iteratorpaar, das den Quell- Bereich der zu verarbeitenden Elemente definiert |
| d_first | - | der Anfang des Zielbereichs |
| policy | - | die zu verwendende Ausführungsrichtlinie |
| p | - |
binäres Prädikat, das
true
zurückgibt, wenn die Elemente als gleich behandelt werden sollen.
Die Signatur der Prädikatfunktion sollte äquivalent zu Folgendem sein: bool pred ( const Type1 & a, const Type2 & b ) ;
Obwohl die Signatur keine
const
&
benötigt, darf die Funktion die übergebenen Objekte nicht modifizieren und muss alle Werte des Typs (möglicherweise const)
|
| Typanforderungen | ||
-
InputIt
muss die Anforderungen von
LegacyInputIterator
erfüllen.
|
||
-
OutputIt
muss die Anforderungen von
LegacyOutputIterator
erfüllen.
|
||
-
ForwardIt1, ForwardIt2
muss die Anforderungen von
LegacyForwardIterator
erfüllen.
|
||
Rückgabewert
Ausgabeiterator auf das Element nach dem letzten geschriebenen Element.
Komplexität
Gegeben N als std:: distance ( first, last ) :
Für Überladungen
(2,4)
kann es zu Leistungseinbußen kommen, wenn der Werttyp von
ForwardIt1
nicht sowohl
CopyConstructible
als auch
CopyAssignable
ist.
Ausnahmen
Die Überladungen mit einem Template-Parameter namens
ExecutionPolicy
melden Fehler wie folgt:
-
Wenn die Ausführung einer als Teil des Algorithmus aufgerufenen Funktion eine Exception wirft und
ExecutionPolicyeiner der Standard-Policies ist, wird std::terminate aufgerufen. Für jede andereExecutionPolicyist das Verhalten implementierungsdefiniert. - Wenn der Algorithmus keinen Speicher allokieren kann, wird std::bad_alloc geworfen.
Mögliche Implementierung
Siehe auch die Implementierungen in libstdc++ und libc++ .
Hinweise
Wenn
InputIt
die Anforderungen
LegacyForwardIterator
erfüllt, liest diese Funktion die Eingabe erneut, um Duplikate zu erkennen.
Andernfalls, wenn
OutputIt
die Anforderungen
LegacyForwardIterator
erfüllt und der Werttyp von
InputIt
mit dem von
OutputIt
übereinstimmt, vergleicht diese Funktion
*
d_first
mit
*
first
.
Andernfalls vergleicht diese Funktion * first mit einer lokalen Elementkopie.
Beispiel
#include <algorithm> #include <iostream> #include <iterator> #include <string> int main() { std::string s1 {"A string with mmmany letters!"}; std::cout << "Before: " << s1 << '\n'; std::string s2; std::unique_copy(s1.begin(), s1.end(), std::back_inserter(s2), [](char c1, char c2) { return c1 == 'm' && 'm' == c2; }); std::cout << "After: " << s2 << '\n'; }
Ausgabe:
Before: A string with mmmany letters! After: A string with many letters!
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 239 | C++98 | das Prädikat wurde std:: distance ( first, last ) Mal angewendet |
ein Mal weniger angewendet
(für nicht-leere Bereiche) |
| LWG 241 | C++98 |
der Werttyp von
InputIt
musste nicht
CopyConstructible
sein
|
bedingt erforderlich |
| LWG 538 | C++98 |
der Werttyp von
InputIt
musste nicht
CopyAssignable
sein
|
bedingt erforderlich |
| LWG 2439 | C++98 |
der Werttyp von
InputIt
musste nicht
CopyConstructible sein, falls
OutputIt
ein
LegacyForwardIterator
ist
|
bedingt erforderlich |
Siehe auch
| findet die ersten beiden benachbarten Elemente, die gleich sind (oder ein gegebenes Prädikat erfüllen) (Funktionsschablone & Algorithmus-Funktionsobjekt) | |
(C++20) |
|
| entfernt aufeinanderfolgende doppelte Elemente in einem Bereich (Funktionsschablone & Algorithmus-Funktionsobjekt) | |
(C++20) |
|
(C++11) |
kopiert einen Bereich von Elementen an einen neuen Speicherort (Funktionsschablone & Algorithmus-Funktionsobjekt) |
(C++20)(C++20) |
|
(C++20) |
erstellt eine Kopie eines Bereichs von Elementen, der keine aufeinanderfolgenden Duplikate enthält (Algorithmus-Funktionsobjekt) |