unique (<algorithm>)
Elimina elementi duplicati che sono adiacenti all'altro in un intervallo specificato.
template<class ForwardIterator>
ForwardIterator unique(
ForwardIterator _First,
ForwardIterator _Last
);
template<class ForwardIterator, class Predicate>
ForwardIterator unique(
ForwardIterator _First,
ForwardIterator _Last,
Predicate _Comp
);
Parametri
_First
Un iteratore avanti destinato alla posizione del primo elemento nell'intervallo da analizzare per la rimozione duplicata._Last
Un iteratore avanti destinato alla posizione una dopo l'elemento finale nell'intervallo da analizzare per la rimozione duplicata._Comp
Oggetto definito dall'utente di funzione predicativa che definisce la condizione soddisfatta se due elementi devono essere considerati equivalenti. Un predicato binario accetta due argomenti e restituisce true se la condizione è soddisfatta e false se non è soddisfatta.
Valore restituito
Un iteratore avanti alla nuova fine della sequenza modificata che non contiene duplicati consecutivi, indirizzante la posizione una dopo l'ultimo elemento non rimosso.
Note
Entrambi i form dell'algoritmo rimuovi come 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.
L'intervallo fatto riferimento deve essere valido; tutti i puntatori devono essere dereferenceable e all'interno della sequenza dell'ultima posizione è raggiungibile da prima dall'aumento. numero di elementi della sequenza non viene modificato dall'algoritmo unique e gli elementi oltre la fine della sequenza modificata sono dereferenceable ma non specificati.
La complessità è lineare, richiedendo (_Last - _First) - 1 confronti.
L'elenco fornisce una funzione membro più efficiente univoco, che può risultare più efficace.
Essi non possono essere utilizzati in un contenitore associativo.
Esempio
// alg_unique.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_Iter3,
v1_NewEnd1, v1_NewEnd2, v1_NewEnd3;
int i;
for ( i = 0 ; i <= 3 ; i++ )
{
v1.push_back( 5 );
v1.push_back( -5 );
}
int ii;
for ( ii = 0 ; ii <= 3 ; ii++ )
{
v1.push_back( 4 );
}
v1.push_back( 7 );
cout << "Vector v1 is ( " ;
for ( v1_Iter1 = v1.begin( ) ; v1_Iter1 != v1.end( ) ; v1_Iter1++ )
cout << *v1_Iter1 << " ";
cout << ")." << endl;
// Remove consecutive duplicates
v1_NewEnd1 = unique ( v1.begin ( ) , v1.end ( ) );
cout << "Removing adjacent duplicates from vector v1 gives\n ( " ;
for ( v1_Iter1 = v1.begin( ) ; v1_Iter1 != v1_NewEnd1 ; v1_Iter1++ )
cout << *v1_Iter1 << " ";
cout << ")." << endl;
// Remove consecutive duplicates under the binary prediate mod_equals
v1_NewEnd2 = unique ( v1.begin ( ) , v1_NewEnd1 , mod_equal );
cout << "Removing adjacent duplicates from vector v1 under the\n "
<< " binary predicate mod_equal gives\n ( " ;
for ( v1_Iter2 = v1.begin( ) ; v1_Iter2 != v1_NewEnd2 ; v1_Iter2++ )
cout << *v1_Iter2 << " ";
cout << ")." << endl;
// Remove elements if preceded by an element that was greater
v1_NewEnd3 = unique ( v1.begin ( ) , v1_NewEnd2, greater<int>( ) );
cout << "Removing adjacent elements satisfying the binary\n "
<< " predicate mod_equal from vector v1 gives ( " ;
for ( v1_Iter3 = v1.begin( ) ; v1_Iter3 != v1_NewEnd3 ; v1_Iter3++ )
cout << *v1_Iter3 << " ";
cout << ")." << endl;
}
Requisiti
Intestazione: <algoritmo>
Spazio dei nomi: std