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