unique_copy
Copie des éléments d'une plage source dans un intervalle de destination à l'exception de les éléments en double qui sont en regard de l'un de l'autre.
template<class InputIterator, class OutputIterator>
OutputIterator unique_copy(
InputIterator _First,
InputIterator _Last,
OutputIterator _Result
);
template<class InputIterator, class OutputIterator, class BinaryPredicate>
OutputIterator unique_copy(
InputIterator _First,
InputIterator _Last,
OutputIterator _Result,
BinaryPredicate _Comp,
);
Paramètres
_First
Un itérateur vers l'avant adressant la position du premier élément de la plage source à copier._Last
Un itérateur vers l'avant adressant une position au delà de le dernier élément dans la plage source à copier._Result
Un itérateur de sortie adressant la position du premier élément de la plage de destination qui accepte la copie avec les doublons consécutifs supprimés._Comp
Objet défini par l'utilisateur de fonction de prédicat qui définit la condition à satisfaire si deux éléments doivent être pris comme équivalents.Un attribut binaire accepte deux arguments et retourne true si satisfaite et false une fois pas de contenu.
Valeur de retour
Un itérateur de sortie adressant une position au delà de le dernier élément dans la plage de destination qui accepte la copie avec les doublons consécutifs supprimés.
Notes
Les deux formes de l'algorithme de supprimer le deuxième double d'une paire consécutive des éléments égaux.
L'exécution de l'algorithme stable afin que la commande relative des éléments repris n'est pas modifiée.
Les plages référencés doivent être valides ; tous les pointeurs doivent être deréférençables et dans une séquence la dernière position est accessible dès le début par l'augmentation.
La complexité est linéaire, lui demandant (_Last – _First) des comparaisons.
unique_copy a deux formes associées :
Pour plus d'informations sur ces fonctions se comportent, consultez Itérateurs vérifiés.
Exemple
// alg_unique_copy.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
#include <ostream>
using namespace std;
// Return whether modulus of elem1 is equal to modulus of elem2
bool mod_equal ( int elem1, int elem2 ) {
if ( elem1 < 0 )
elem1 = - elem1;
if ( elem2 < 0 )
elem2 = - elem2;
return elem1 == elem2;
};
int main() {
vector <int> v1;
vector <int>::iterator v1_Iter1, v1_Iter2,
v1_NewEnd1, v1_NewEnd2;
int i;
for ( i = 0 ; i <= 1 ; i++ ) {
v1.push_back( 5 );
v1.push_back( -5 );
}
int ii;
for ( ii = 0 ; ii <= 2 ; ii++ )
v1.push_back( 4 );
v1.push_back( 7 );
int iii;
for ( iii = 0 ; iii <= 5 ; iii++ )
v1.push_back( 10 );
cout << "Vector v1 is\n ( " ;
for ( v1_Iter1 = v1.begin( ) ; v1_Iter1 != v1.end( ) ; v1_Iter1++ )
cout << *v1_Iter1 << " ";
cout << ")." << endl;
// Copy first half to second, removing consecutive duplicates
v1_NewEnd1 = unique_copy ( v1.begin ( ) , v1.begin ( ) + 8, v1.begin ( ) + 8 );
cout << "Copying the first half of the vector to the second half\n "
<< "while removing adjacent duplicates gives\n ( " ;
for ( v1_Iter1 = v1.begin( ) ; v1_Iter1 != v1_NewEnd1 ; v1_Iter1++ )
cout << *v1_Iter1 << " ";
cout << ")." << endl;
int iv;
for ( iv = 0 ; iv <= 7 ; iv++ )
v1.push_back( 10 );
// Remove consecutive duplicates under the binary prediate mod_equals
v1_NewEnd2 = unique_copy ( v1.begin ( ) , v1.begin ( ) + 14,
v1.begin ( ) + 14 , mod_equal );
cout << "Copying the first half of the vector to the second half\n "
<< " removing adjacent duplicates under mod_equals gives\n ( " ;
for ( v1_Iter2 = v1.begin( ) ; v1_Iter2 != v1_NewEnd2 ; v1_Iter2++ )
cout << *v1_Iter2 << " ";
cout << ")." << endl;
}
Sortie
Vector v1 is
( 5 -5 5 -5 4 4 4 7 10 10 10 10 10 10 ).
Copying the first half of the vector to the second half
while removing adjacent duplicates gives
( 5 -5 5 -5 4 4 4 7 5 -5 5 -5 4 7 ).
Copying the first half of the vector to the second half
removing adjacent duplicates under mod_equals gives
( 5 -5 5 -5 4 4 4 7 5 -5 5 -5 4 7 5 4 7 5 4 7 ).
Configuration requise
en-tête : <algorithm>
l'espace de noms : DST