unique_copy
Kopie prvky ze zdrojové oblasti do cílové oblasti, s výjimkou duplicitní prvky, které jsou na sebe.
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,
);
Parametry
_First
Dopředu iterační adresování pozici první prvek ve zdrojové oblasti ke kopírování._Last
Dopředu iterační adresování jednu pozici za poslední prvek ve zdrojové oblasti ke kopírování._Result
Iterace výstup adresování pozici první prvek v cílové oblasti, který přijímá kopii s duplicitní po sobě jdoucí odebrána._Comp
Uživatelem definované funkce predikátu objektu, který definuje podmínky splněny, pokud jsou dva prvky mají být přijata jako rovnocenné.Binárního predikátu trvá dva argumenty a vrátí true -li splněna a false Pokud nejsou splněny.
Vrácená hodnota
Iterace výstup adresování jednu pozici za poslední prvek v cílové oblasti, který přijímá kopii s duplicitní po sobě jdoucí odebrána.
Poznámky
Obě formy algoritmus odebrat duplicitní druhého páru po sobě jdoucích stejné prvky.
Operace algoritmus je stabilní, tak, že se nezmění relativní pořadí prvků obnovena.
Odkazované oblasti musí být platné; všechny ukazatele musí být dereferenceable a v rámci posloupnosti je dostupná z první poslední pozice ve incrementation.
Složitost je lineární vyžadující (_Last – _First) porovnání.
unique_copymá dva související formuláře:
Informace o chování těchto funkcí naleznete v tématu Zaškrtnuté iterátory.
Příklad
// 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;
}
Výsledek
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 ).
Požadavky
Záhlaví: <algorithm>
Obor názvů: std