std::unique_copy
| Défini dans l'en-tête <algorithm>
|
||
template< class InputIt, class OutputIt >
OutputIt unique_copy( InputIt first, InputIt last, OutputIt d_first );
|
(1) | (constexpr depuis C++20) |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt2 unique_copy( ExecutionPolicy&& policy, ForwardIt1 first,
ForwardIt1 last, ForwardIt2 d_first );
|
(2) | (depuis C++17) |
template< class InputIt, class OutputIt, class BinaryPred >
OutputIt unique_copy( InputIt first, InputIt last,
OutputIt d_first, BinaryPred p );
|
(3) | (constexpr depuis 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) | (depuis C++17) |
Copie les éléments de la plage [first, last) vers une autre plage commençant à d_first de telle sorte qu'il n'y ait pas d'éléments égaux consécutifs. Seul le premier élément de chaque groupe d'éléments égaux est copié.
operator==.operator== n'établit pas une relation d'équivalence, le comportement est indéfini.p.p n'établit pas une relation d'équivalence, le comportement est indéfini.policy.true :
|
|
(jusqu'à C++20) |
|
|
(depuis C++20) |
Si *d_first = *first est invalide(jusqu'à C++20)*first n'est pas accessible en écriture sur d_first(depuis C++20), le programme est mal formé.
Si les plages source et destination se chevauchent, le comportement est indéfini.
Étant donné T comme type valeur de InputIt, si la surcharge (1) ou (3) ne satisfait pas toutes les conditions suivantes, le comportement est indéfini :
|
(jusqu'à C++20) |
|
(depuis C++20) |
Test à la fois CopyConstructible et CopyAssignable.- Toutes les conditions suivantes sont satisfaites :
OutputItsatisfait aux exigences de LegacyForwardIterator.- Le type valeur de
OutputItest aussiT. Test CopyAssignable.
Paramètres
| first, last | - | la paire d'itérateurs définissant la plage source des éléments à traiter |
| d_first | - | le début de la plage de destination |
| policy | - | la politique d'exécution à utiliser |
| p | - |
prédicat binaire qui renvoie
true
si les éléments doivent être traités comme égaux.
La signature de la fonction de prédicat doit être équivalente à ce qui suit : bool pred ( const Type1 & a, const Type2 & b ) ;
Bien que la signature n'ait pas besoin d'avoir
const
&
, la fonction ne doit pas modifier les objets qui lui sont passés et doit pouvoir accepter toutes les valeurs du type (éventuellement const)
|
| Exigences de type | ||
-
InputIt
doit satisfaire aux exigences de
LegacyInputIterator
.
|
||
-
OutputIt
doit satisfaire aux exigences de
LegacyOutputIterator
.
|
||
-
ForwardIt1, ForwardIt2
doit satisfaire aux exigences de
LegacyForwardIterator
.
|
||
Valeur de retour
Itérateur de sortie vers l'élément situé après le dernier élément écrit.
Complexité
Étant donné N comme std:: distance ( first, last ) :
Pour les surcharges
(2,4)
, il peut y avoir un coût de performance si le type de valeur de
ForwardIt1
n'est pas à la fois
CopyConstructible
et
CopyAssignable
.
Exceptions
Les surcharges avec un paramètre de modèle nommé
ExecutionPolicy
signalent les erreurs comme suit :
-
Si l'exécution d'une fonction invoquée dans le cadre de l'algorithme lève une exception et que
ExecutionPolicyfait partie des politiques standard , std::terminate est appelé. Pour tout autreExecutionPolicy, le comportement est défini par l'implémentation. - Si l'algorithme ne parvient pas à allouer de la mémoire, std::bad_alloc est levé.
Implémentation possible
Voir également les implémentations dans libstdc++ et libc++ .
Notes
Si
InputIt
satisfait
LegacyForwardIterator
, cette fonction relit l'entrée afin de détecter les doublons.
Sinon, si
OutputIt
satisfait
LegacyForwardIterator
, et que le type de valeur de
InputIt
est le même que celui de
OutputIt
, cette fonction compare
*
d_first
à
*
first
.
Sinon, cette fonction compare * first à une copie locale d'élément.
Exemple
#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'; }
Sortie :
Before: A string with mmmany letters! After: A string with many letters!
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement tel que publié | Comportement correct |
|---|---|---|---|
| LWG 239 | C++98 | le prédicat était appliqué std:: distance ( first, last ) fois |
appliqué une fois de moins
(pour les plages non vides) |
| LWG 241 | C++98 |
le type de valeur de
InputIt
n'était pas requis d'être
CopyConstructible
|
conditionnellement requis |
| LWG 538 | C++98 |
le type de valeur de
InputIt
n'était pas requis d'être
CopyAssignable
|
conditionnellement requis |
| LWG 2439 | C++98 |
le type de valeur de
InputIt
n'était pas requis d'être
CopyConstructible si
OutputIt
est un
LegacyForwardIterator
|
conditionnellement requis |
Voir aussi
| trouve les deux premiers éléments adjacents qui sont égaux (ou satisfont un prédicat donné) (modèle de fonction& objet fonction d'algorithme) | |
(C++20) |
|
| supprime les éléments en double consécutifs dans une plage (modèle de fonction& objet fonction d'algorithme) | |
(C++20) |
|
(C++11) |
copie une plage d'éléments vers un nouvel emplacement (modèle de fonction& objet fonction d'algorithme) |
(C++20)(C++20) |
|
(C++20) |
crée une copie d'une plage d'éléments ne contenant aucun doublon consécutif (objet fonction d'algorithme) |