unique_copy
Копирует элементы из источника в назначение диапазона диапазоне символов, за исключением элементов, рядом с друг с другом.
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,
);
Параметры
_First
Передний итератор слишком позицию первого элемента в диапазон источника копированию._Last
Передний итератор слишком положение за одно окончательное элементом в диапазон источника копированию._Result
Итератор вывода слишком позицию первого элемента в диапазоне назначения, который получает копию с последовательные удалять дубликаты._Comp
Определяемый пользователем объект функции предиката, который определяет условия, которые должны удовлетворять case 2 элемента, которое необходимо выполнить как эквивалента. Двоичный предикат принимает два аргумента и возвращает true , если он удовлетворяется, и false, если не удовлетворяется.
Возвращаемое значение
Итератор вывода слишком положение за одно окончательное элементом в диапазоне назначения, который получает копию с последовательные удалять дубликаты.
Заметки
Обе формы алгоритма удаляет второй дубликат последовательной пары равных элементов.
Операция алгоритма стабилизирована так, что не будет изменен относительный порядок не вычеркнутых элементов.
Связанные диапазоны должны быть допустимыми; все указатели должны быть dereferenceable и внутри последовательности последнего положения доступен из первого инкрементацией.
Сложность линейная, без (_Last — _First) сравнений.
unique_copy имеет две связанные формы:
Дополнительные сведения о том, как ведут себя эти функции, см. в разделе Проверяемые итераторы.
Пример
// 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 ).
Требования
Заголовок: <algorithm>
Пространство имен: std