set_difference
Všechny prvky, které patří do jedné, seřazené cílové oblasti, kde lze zadat kritéria řazení binárního predikátu seřazené jedné zdrojové oblasti, ale nikoli druhá oblast řazení zdroj jednotek.
template<class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_difference(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
OutputIterator result
);
template<class InputIterator1, class InputIterator2, class OutputIterator, class BinaryPredicate>
OutputIterator set_difference(
InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
OutputIterator result,
BinaryPredicate comp
);
Parametry
first1
Vstupní iterační adresování první prvek pozice v první dva seřazené zdrojových oblastí spojené a seřazeny do jednoho rozsahu představující rozdíl dvou zdrojových oblastí.last1
Vstupní iterátoru adresování postavení jednoho za poslední prvek v první dva seřazené zdrojových oblastí spojené a seřazeny do jednoho rozsahu představující rozdíl dvou zdrojových oblastí.first2
Vstupní adresování první prvek pozice ve dvou po sobě jdoucích druhé iterace seřazeny zdrojových oblastí spojené a seřazeny do jednoho rozsahu představující rozdíl dvou zdrojových oblastí.last2
Vstupní iterace adresování jednu pozici minulých poslední prvek v druhé dvou po sobě jdoucích seřazeny zdrojových oblastí spojené a seřazeny do jednoho rozsahu představující rozdíl dvou zdrojových oblastí.result
Iterace výstup adresování pozici první prvek v cílové oblasti, kde mají být spojeny do jediného seřazené oblasti představuje rozdíl dvou zdrojových oblastí dva zdrojové oblasti.comp
Uživatelem definované funkce predikátu objektu, který definuje smysl, ve kterém jeden prvek je větší než jiné.Binárního predikátu trvá dva argumenty a měl vrátit true při prvním prvkem je menší než druhý prvek a false jinak.
Vrácená hodnota
Iterace výstup adresování jednu pozici za poslední prvek v seřazené cílové oblasti představuje rozdíl dvou zdrojových oblastí.
Poznámky
Odkazovaný seřazené zdrojových oblastí musí být platné; všechny ukazatele musí být dereferenceable a v rámci každé sekvence musí být dostupná z první poslední pozice ve incrementation.
Cílová oblast buď zdrojové oblasti se nesmí překrývat a musí být dostatečně velká první zdrojové oblasti.
Seřazené zdrojových oblastí každé uspořádán podmínkou pro použití set_difference algoritmus podle stejné pořadí jako je algoritmus používaný řazení kombinované rozsahy.
Operace je stabilní relativní pořadí prvků v každé oblasti je zachována v cílové oblasti.Sloučení algoritmus zdrojových oblastí nebyly změněny.
Typy hodnot vstupní iterátorů je třeba méně než srovnatelné objednáno, aby dané dva prvky mohou být stanoveny buď jsou rovnocenné (v tom smyslu, že ani menší než ostatní) nebo jeden je menší než ostatní.Výsledkem objednání mezi nonequivalent prvky.Při ekvivalentní prvky v obou zdrojových oblastí prvky v první oblasti předcházet prvky z druhé zdrojové oblasti v cílové oblasti.Zdrojové oblasti obsahují duplicitní prvek takové, že jsou další první zdrojové oblasti než ve druhém, cílová oblast bude obsahovat číslo, kterým výskytů těchto prvků v první zdrojovou oblast překročit výskytů těchto prvků v druhém zdrojové oblasti.
Složitost algoritmu je lineární s maximálně 2 * ((Příjmení1 – first1) – (Příjmení2 – first2)) – 1 porovnání neprázdné zdrojových oblastí.
set_differencemá dva související formuláře:
Informace o chování těchto funkcí naleznete v tématu Zaškrtnuté iterátory.
Příklad
// alg_set_diff.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional> // For greater<int>( )
#include <iostream>
// Return whether modulus of elem1 is less than modulus of elem2
bool mod_lesser (int elem1, int elem2 )
{
if (elem1 < 0)
elem1 = - elem1;
if (elem2 < 0)
elem2 = - elem2;
return elem1 < elem2;
}
int main( )
{
using namespace std;
vector <int> v1a, v1b, v1 ( 12 );
vector <int>::iterator Iter1a, Iter1b, Iter1, Result1;
// Constructing vectors v1a & v1b with default less-than ordering
int i;
for ( i = -1 ; i <= 4 ; i++ )
{
v1a.push_back( i );
}
int ii;
for ( ii =-3 ; ii <= 0 ; ii++ )
{
v1b.push_back( ii );
}
cout << "Original vector v1a with range sorted by the\n "
<< "binary predicate less than is v1a = ( " ;
for ( Iter1a = v1a.begin( ) ; Iter1a != v1a.end( ) ; Iter1a++ )
cout << *Iter1a << " ";
cout << ")." << endl;
cout << "Original vector v1b with range sorted by the\n "
<< "binary predicate less than is v1b = ( " ;
for ( Iter1b = v1b.begin ( ) ; Iter1b != v1b.end ( ) ; Iter1b++ )
cout << *Iter1b << " ";
cout << ")." << endl;
// Constructing vectors v2a & v2b with ranges sorted by greater
vector <int> v2a ( v1a ) , v2b ( v1b ) , v2 ( v1 );
vector <int>::iterator Iter2a, Iter2b, Iter2, Result2;
sort ( v2a.begin ( ) , v2a.end ( ) , greater<int> ( ) );
sort ( v2b.begin ( ) , v2b.end ( ) , greater<int> ( ) );
cout << "Original vector v2a with range sorted by the\n "
<< "binary predicate greater is v2a = ( " ;
for ( Iter2a = v2a.begin ( ) ; Iter2a != v2a.end ( ) ; Iter2a++ )
cout << *Iter2a << " ";
cout << ")." << endl;
cout << "Original vector v2b with range sorted by the\n "
<< "binary predicate greater is v2b = ( " ;
for ( Iter2b = v2b.begin ( ) ; Iter2b != v2b.end ( ) ; Iter2b++ )
cout << *Iter2b << " ";
cout << ")." << endl;
// Constructing vectors v3a & v3b with ranges sorted by mod_lesser
vector <int> v3a ( v1a ), v3b ( v1b ) , v3 ( v1 );
vector <int>::iterator Iter3a, Iter3b, Iter3, Result3;
sort ( v3a.begin ( ) , v3a.end ( ) , mod_lesser );
sort ( v3b.begin ( ) , v3b.end ( ) , mod_lesser );
cout << "Original vector v3a with range sorted by the\n "
<< "binary predicate mod_lesser is v3a = ( " ;
for ( Iter3a = v3a.begin ( ) ; Iter3a != v3a.end ( ) ; Iter3a++ )
cout << *Iter3a << " ";
cout << ")." << endl;
cout << "Original vector v3b with range sorted by the\n "
<< "binary predicate mod_lesser is v3b = ( " ;
for ( Iter3b = v3b.begin ( ) ; Iter3b != v3b.end ( ) ; Iter3b++ )
cout << *Iter3b << " ";
cout << ")." << endl;
// To combine into a difference in asscending
// order with the default binary predicate less <int> ( )
Result1 = set_difference ( v1a.begin ( ) , v1a.end ( ) ,
v1b.begin ( ) , v1b.end ( ) , v1.begin ( ) );
cout << "Set_difference of source ranges with default order,"
<< "\n vector v1mod = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != Result1 ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// To combine into a difference in descending
// order specify binary predicate greater<int>( )
Result2 = set_difference ( v2a.begin ( ) , v2a.end ( ) ,
v2b.begin ( ) , v2b.end ( ) ,v2.begin ( ) , greater <int> ( ) );
cout << "Set_difference of source ranges with binary"
<< "predicate greater specified,\n vector v2mod = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != Result2 ; Iter2++ )
cout << *Iter2 << " ";
cout << ")." << endl;
// To combine into a difference applying a user
// defined binary predicate mod_lesser
Result3 = set_difference ( v3a.begin ( ) , v3a.end ( ) ,
v3b.begin ( ) , v3b.end ( ) , v3.begin ( ) , mod_lesser );
cout << "Set_difference of source ranges with binary "
<< "predicate mod_lesser specified,\n vector v3mod = ( " ; ;
for ( Iter3 = v3.begin( ) ; Iter3 != Result3 ; Iter3++ )
cout << *Iter3 << " ";
cout << ")." << endl;
}
Výsledek
Original vector v1a with range sorted by the
binary predicate less than is v1a = ( -1 0 1 2 3 4 ).
Original vector v1b with range sorted by the
binary predicate less than is v1b = ( -3 -2 -1 0 ).
Original vector v2a with range sorted by the
binary predicate greater is v2a = ( 4 3 2 1 0 -1 ).
Original vector v2b with range sorted by the
binary predicate greater is v2b = ( 0 -1 -2 -3 ).
Original vector v3a with range sorted by the
binary predicate mod_lesser is v3a = ( 0 -1 1 2 3 4 ).
Original vector v3b with range sorted by the
binary predicate mod_lesser is v3b = ( 0 -1 -2 -3 ).
Set_difference of source ranges with default order,
vector v1mod = ( 1 2 3 4 ).
Set_difference of source ranges with binarypredicate greater specified,
vector v2mod = ( 4 3 2 1 ).
Set_difference of source ranges with binary predicate mod_lesser specified,
vector v3mod = ( 1 4 ).
Požadavky
Záhlaví: <algorithm>
Obor názvů: std