unique (<algorithm>)
Удаляет повторяющиеся элементы, за друг друга в указанном диапазоне.
template<class ForwardIterator>
ForwardIterator unique(
ForwardIterator _First,
ForwardIterator _Last
);
template<class ForwardIterator, class Predicate>
ForwardIterator unique(
ForwardIterator _First,
ForwardIterator _Last,
Predicate _Comp
);
Параметры
_First
Передний итератор адресацию положение первого элемента в диапазоне быть отсканированы для двойного удаления._Last
Позиция одного итератора передний адресации, final элементом в диапазоне быть отсканированы для двойного удаления._Comp
Определяемый пользователем объект функции предиката, который определяет условия, которые должны отвечать если 2 элемента, выполняемое в виде числа.Binary предикат принимает 2 аргумента и возвращает true, когда выполняется и false, если не выполняется.
Возвращаемое значение
Передний итератор к новому конец измененной последовательности, которая не содержит последовательные дубликаты, одно адресации положение после последнего не удаленным элементом.
Заметки
Обе формы дистанционного алгоритма удалить второй дубликат последующей пары равных элементов.
Операция алгоритма стабилизирована, чтобы не будет изменен относительный порядок невычеркнутых элементов.
Ссылочное диапазон должен быть допустимым; все указатели должны быть dereferenceable и в последовательности последняя позиция доступен из первого инкрементацией.он не изменяется количество элементов в последовательности алгоритмом unique и элементы, за концом измененной последовательности dereferenceable но не определены.
Сложность линейная, требующ (_Last – _First) – сравнения 1.
Список предоставляет более эффективный функции-члена unique, который может выполняться быстрее.
Эти алгоритмы нельзя использовать в ассоциативном контейнере.
Пример
// 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;
}
Требования
заголовок: <algorithm>
std пространство имен: