Condividi tramite


unique_copy

Copia di elementi da un intervallo di origine in un intervallo di destinazione eccezione degli elementi duplicati che sono adiacenti all'altro.

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,
   );

Parametri

  • _First
    Un iteratore avanti destinato alla posizione del primo elemento nell'intervallo di origine da copiare.

  • _Last
    Un iteratore avanti destinato alla posizione una dopo l'elemento finale nell'intervallo di origine da copiare.

  • _Result
    Un iteratore di output destinato alla posizione del primo elemento nell'intervallo di destinazione che riceve la copia con i duplicati consecutivi rimossi.

  • _Comp
    Oggetto definito dall'utente di funzione di predicato che definisce la condizione soddisfatta se due elementi devono essere considerati equivalenti.Un predicato binario accetta due argomenti e restituisce true una volta soddisfatti e false una volta non soddisfatta.

Valore restituito

Un iteratore di output destinato alla posizione una dopo l'elemento finale nell'intervallo di destinazione che riceve la copia con i duplicati consecutivi rimossi.

Note

Entrambi i form dell'algoritmo rimuovere il secondo duplicato di una coppia consecutiva di elementi uguali.

L'operazione dell'algoritmo diventa stabile in modo da non modificare l'ordine degli elementi non eliminati.

Gli intervalli fatto riferimento siano validi, tutti i puntatori devono essere dereferenceable e all'interno di una sequenza dell'ultima posizione è raggiungibile da prima dall'aumento.

Complessità è lineare, richiedendo_Last (–) _Firstconfronti.

unique_copy dispone di due form correlati:

Per informazioni su come queste funzioni si comportano, vedere Iteratori verificati.

Esempio

// 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;
}

Output

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 ).

Requisiti

intestazione: <algorithm>

Spazio dei nomi: deviazione standard

Vedere anche

Riferimenti

Libreria di modelli standard