Partager via


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

Voir aussi

Référence

Modèles Standard