Freigeben über


set_difference

Vereinigt alle Elemente, die ein Quellbereich sortierten gehören, jedoch keiner Sekunde sortierte Quellbereich, in einem einzelnen, sortierten Zielbereich, wobei Sortierkriterium möglicherweise durch ein binäres Prädikat angegeben wird.

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 
   );

Parameter

  • first1
    Ein Eingabeiterator, der die Position des ersten Elements in der ersten von zwei anspricht, sortierte in einen einzelnen Bereich vereinigt werden und sortiert wurden die Quellbereiche, mit der der Unterschied der zwei Quellbereiche darstellt.

  • last1
    Ein Eingabeiterator, der die Position eine hinter dem letzten Element in der ersten von zwei anspricht, sortierte in einen einzelnen Bereich vereinigt werden und sortiert wurden die Quellbereiche, mit der der Unterschied der zwei Quellbereiche darstellt.

  • first2
    Ein Eingabeiterator, der die Position des ersten Elements in zweiten von zwei aufeinander sortierten Quellbereichen behandelt vereinigt werden und einen einzelnen Bereich sortiert wurde veranschaulicht den Unterschied der zwei Quellbereiche.

  • last2
    Ein Eingabeiterator, der die Position eine hinter dem letzten Element in zweiten von zwei aufeinander sortierten Quellbereichen behandelt vereinigt werden und einen einzelnen Bereich sortiert wurde veranschaulicht den Unterschied der zwei Quellbereiche.

  • result
    Ein Ausgabeiterator, der die Position des ersten Elements im Zielbereich abweicht, in der die zwei Quellbereiche in einen einzelnen Bereich sortierten vereinigt werden sollen, mit der der Unterschied der zwei Quellbereiche darstellt.

  • comp
    Benutzerdefiniertes Prädikatfunktionsobjekt, das den Sinn definiert, in dem ein Element größer als ein anderes ist. Das binäre Prädikat akzeptiert zwei Argumente und sollte true zurückgeben, wenn das erste Element, kleiner als das zweite Element ist, und andernfalls false.

Rückgabewert

Ein Ausgabeiterator, der die Position eine hinter dem letzten Element im Zielbereich sortierten darstellt den Unterschied der zwei Quellbereiche behandelt.

Hinweise

In sortierten Quellbereiche, auf die verwiesen wird, müssen gültig sein; alle Zeiger müssen dereferenzierbar befinden jeder Sequenz muss die letzte Position der ersten von Zunahme erreichbar sein.

Der Zielbereich sollte nicht von den Quellbereichen auch nicht überschneiden und sollte so groß sein, den ersten Quellbereich zu enthalten.

In sortierten Quellbereiche müssen jedes während eine Vorbedingung der Verwendung des set_difference - Algorithmus mit derselben Reihenfolge angeordnet werden, z, den Algorithmus verwendet werden, um die kombinierte Bereiche zu sortieren ist.

Der Vorgang ist stabil, da die relative Position der Elemente in jedem Bereich im Zielbereich beibehalten wird. Die Quellbereiche werden nicht durch die Algorithmuszusammenführung geändert.

Die Werttypen der Eingabeiteratoren müssen weniger-als-vergleichbar sein sortiert werden, sodass, zwei Elemente angegeben wurden, wird bestimmt werden kann jeder, ob sie äquivalent sind (im Sinne, dass nicht geringer als die andere ist), oder dass von kleiner als die andere. Dies führt zu einer Sortierung zwischen den nicht gleichwertigen Elementen. Wenn das passende Elemente in beiden Quellbereichen gibt, wechseln die Elemente im ersten Bereich Elementen vom zweiten Quellbereich im Zielbereich voran. Wenn die Quellbereiche Duplikate eines Elements enthalten, sodass mehr im ersten Quellbereich als im zweiten gibt, enthält der Zielbereich die Zahl, von der die Vorkommen dieser Elemente im ersten Quellbereich die Vorkommen dieser Elemente im zweiten Quellbereich überschreiten.

Die Komplexität des Algorithmus ist mit höchstens 2 linear * ((last1 - first1) - (last2 - first2)) - 1 für Vergleiche nicht leere Quellbereiche.

set_difference verfügt über zwei verknüpfte Formulare:

Informationen über das Verhalten dieser Funktionen finden Sie unter Überprüfte Iteratoren.

Beispiel

// 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;
}

Ausgabe

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 ).

Anforderungen

Header: <algorithm>

Namespace: std

Siehe auch

Referenz

Standardvorlagenbibliothek