Partager via


set_difference

Unit tous les éléments qui appartiennent à une plage source triée, mais pas à une seconde est trié la plage source, en une seule, triées plage de destination, où le respect du classement peut être spécifié par un attribut binaire.

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

Paramètres

  • first1
    Un itérateur d'entrée adressage la position du premier élément de la première de deux trié des plages sources à unir et être triées dans une seule plage qui représente la différence des deux plages sources.

  • last1
    Un itérateur d'entrée adressage la position une après le dernier élément de la première de deux trié des plages sources à unir et être triées dans une seule plage qui représente la différence des deux plages sources.

  • first2
    Un itérateur d'entrée adressage la position du premier élément dans la seconde de plusieurs plages sources triées consécutives à unir et être triées dans une seule plage qui représente la différence des deux plages sources.

  • last2
    Un itérateur d'entrée adressage la position une après le dernier élément de la seconde de plusieurs plages sources triées consécutives à unir et être triées dans une seule plage qui représente la différence des deux plages sources.

  • result
    Un itérateur de sortie adressage la position du premier élément dans la plage de destination où les deux plages sources doivent être unies dans une seule plage triée qui représente la différence des deux plages sources.

  • comp
    Objet de fonction de prédicat défini par l'utilisateur qui définit le sens dans lequel un élément est supérieur à un autre. Le prédicat binaire accepte deux arguments et doit retourner true lorsque le premier élément est plus petit que le deuxième élément et false sinon.

Valeur de retour

Un itérateur de sortie adressage la position une après le dernier élément dans la plage de destination triée qui représente la différence des deux plages sources.

Notes

Les plages sources triées référencées doivent être valides ; tous les pointeurs doivent être deréférençables et dans chaque séquence la dernière position doit être accessible la collection contenue par l'augmentation.

La plage de destination ne doivent pas se chevaucher non plus les plages sources et doit être assez importante pour contenir la première plage source.

Les plages de tri doivent tous être organisées comme une condition préalable à l'application de l'algorithme d'set_difference conformément à la même classe qui n'est pas être utilisé par l'algorithme pour trier les plages associées.

L'opération est stable car l'ordre relatif d'éléments dans chaque plage est conservé dans la plage de destination. Les plages sources ne sont pas modifiées par la fusion d'algorithmes.

Les types de les itérateurs d'entrée doivent être moins-que- comparables pour être triés, de sorte que, en deux éléments, il peut déterminer celui qu'ils sont équivalents (en ce sens que ni l'un ni l'autre n'est inférieur à l'autre) ou qu'il est inférieur à l'autre. Cela entraîne un classement entre les éléments non-équivalents. En présence de éléments équivalents dans les deux plages sources, les éléments de la première plage précèdent les éléments de la deuxième plage source dans la plage de destination. Si les plages sources contiennent les doublons d'un élément de sorte qu'il existe plus dans la première plage source dans la seconde, la plage de destination contient le nombre par lequel les occurrences de ces éléments dans la première plage source sont les occurrences de ces éléments dans la deuxième plage source.

La complexité de l'algorithme un-à-un avec au plus 2 * (last1 – first1) – (last2 – first2)) – les comparaisons 1 pour les plages sources vides.

set_difference a deux formulaires connexes :

Pour plus d'informations sur le comportement de ces fonctions, consultez Itérateurs vérifiés.

Exemple

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

Sortie

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

Configuration requise

En-tête : <algorithme>

Espace de noms : std

Voir aussi

Référence

Bibliothèque STL (Standard Template Library)