unique (<algorithm>)
Usuwa zduplikowane elementy, które sąsiadują ze sobą w określonym zakresie.
template<class ForwardIterator>
ForwardIterator unique(
ForwardIterator _First,
ForwardIterator _Last
);
template<class ForwardIterator, class Predicate>
ForwardIterator unique(
ForwardIterator _First,
ForwardIterator _Last,
Predicate _Comp
);
Parametry
_First
Do przodu sterująca, zajęcie pozycji pierwszego elementu w zakresie skanowania do usuwania duplikatów._Last
Do przodu sterująca, zajęcie pozycji jeden obok ostatniego elementu w zakresie do skanowania do usuwania duplikatów._Comp
Zdefiniowana przez użytkownika funkcja predykatu obiektu, który definiuje warunek za spełniony, jeśli dwa elementy mają być pobierane za równoważny.Predykat dwuelementowy przyjmuje dwa argumenty i zwraca wartość true po spełnieniu oraz false, jeśli nie jest spełniony.
Wartość zwracana
Do przodu sterująca do nowego końca sekwencji zmodyfikowanych, która nie zawiera następujących po sobie duplikatów, adresowania jedną pozycję poza ostatni element nie został usunięty.
Uwagi
Obie formy algorytmu Usuń duplikat drugiej pary kolejnych elementów równe.
Operacja algorytmu jest stabilny, tak, że względna kolejność elementów nieusuniętym nie ulega zmianie.
Zakres odwołania musi być ważny; wszystkie wskaźniki muszą być dereferenceable i w sekwencji ostatniej pozycji jest dostępny z pierwszym przez incrementation. Liczba elementów w sekwencji nie zmieniło przez algorytm unikatowy i elementy poza końcem zmodyfikowane sekwencji są dereferenceable, ale nie określono.
Złożoność jest liniowy, wymagające (_Last - _First)-1 porównań.
Lista zawiera bardziej efektywne funkcji członka unikatowy, które mogą działać lepiej.
Nie można używać tych algorytmów asocjacyjne kontenera.
Przykład
// 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;
}
Wymagania
Nagłówek: <algorytm>
Przestrzeń nazw: std