Partager via


unique_copy

Éléments de copies d'une plage source dans une plage de destination à l'exception de les éléments en double qui sont les uns â côté des autres.

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 par progression adressage la position du premier élément dans la plage source à copier.

  • _Last
    Un itérateur par progression adressage la position une après l'élément final dans la plage source à copier.

  • _Result
    Un itérateur de sortie adressage la position du premier élément dans la plage de destination qui reçoit la copie des doublons consécutifs supprimés.

  • _Comp
    Objet de la fonction définie par l'utilisateur de prédicat qui définit la condition à répondre si deux éléments doivent être pris comme équivalent. Un prédicat binaire a besoin de deux arguments. Il renvoie true lorsqu'il est satisfait et false dans le cas contraire.

Valeur de retour

Un itérateur de sortie adressage la position une après l'élément final dans la plage de destination qui reçoit la copie des doublons consécutifs supprimés.

Notes

Les deux formes de l'algorithme supprimez le deuxième doublon d'une paire consécutive d'éléments égaux.

Le fonctionnement de l'algorithme est stable afin que l'ordre relatif des éléments restaurés n'est pas modifié.

Les plages référencées doivent être valides ; tous les pointeurs doivent être deréférençables et dans une séquence la dernière position est accessible la collection contenue par l'augmentation.

La complexité un-à-un, ce qui_Last (–)_Firstles comparaisons.

unique_copy a deux formulaires connexes :

Pour plus d'informations sur le comportement de ces fonctions, 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 : <algorithme>

Espace de noms : std

Voir aussi

Référence

Bibliothèque STL (Standard Template Library)