2008-11-12 13 views

Répondre

11

Oui, il existe une fonction set_difference dans l'en-tête des algorithmes.

: Edits

Pour votre information, la structure de données de jeu est capable d'utiliser efficacement cet algorithme, comme indiqué dans son documentation. L'algorithme ne fonctionne pas seulement sur les ensembles mais sur n'importe quelle paire d'itérateurs sur les collections triées.

Comme d'autres l'ont mentionné, il s'agit d'un algorithme externe, pas d'une méthode. Vraisemblablement, c'est bien pour votre application.

+1

Il est utilisable sur _any_ paire de conteneurs triés. – xtofl

+0

Bon point ... J'ai ajouté une note dans les modifications. –

1

Pas comme méthode, mais il y a la fonction de l'algorithme externe set_difference

template <class InputIterator1, class InputIterator2, class OutputIterator> 
OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, 
           InputIterator2 first2, InputIterator2 last2, 
           OutputIterator result); 

http://www.sgi.com/tech/stl/set_difference.html

119

Oui, il est, il est dans <algorithm> et est appelé: std::set_difference. L'utilisation est:

#include <algorithm> 
#include <set> 
#include <iterator> 
// ... 
std::set<int> s1, s2; 
// Fill in s1 and s2 with values 
std::set<int> result; 
std::set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), 
    std::inserter(result, result.end())); 

En fin de compte, l'ensemble result contiendra le s1-s2.

+0

+1. Malheureusement, quand j'en avais besoin, j'ai abandonné et lancé ma propre boucle :( – peterchen

+38

BTW, si vous utilisez set_difference sur une classe de conteneur non-associative, disons un vecteur, assurez-vous que les éléments des deux conteneurs sont triés en premier ... ? – paxos1977

+4

#include -> Aucun fichier, devrait être stefanB

2

La réponse choisie est correcte, mais comporte des erreurs de syntaxe.

Au lieu de

#include <algorithms> 

utilisation

#include <algorithm> 

Au lieu de

std::insert_iterator(result, result.end())); 

utilisation

std::insert_iterator<set<int> >(result, result.end())); 
+7

ou simplement utiliser' std :: inserter (result, result.end()) ' – rlbond

0

pouvons-nous simplement utiliser

set_difference(set1.begin(), set1.end(), set2.begin(). set2,end(),std::back_inserter(result)). 
+3

' std :: back_inserter' nécessite la méthode 'push_back()' sur le conteneur cible 'result'. Cela ne fonctionnera pas si' result' est un 'std :: set' – Attila

1

Encore une fois, coup de pouce à la rescousse:

#include <string> 
#include <set> 
#include <boost/range/algorithm/set_algorithm.hpp> 

std::set<std::string> set0, set1, setDifference; 
boost::set_difference(set0, set1, std::inserter(setDifference, setDifference.begin()); 

setDifference contiendra SET0-set1.

0

C++ ne définit pas un opérateur de différence de jeu mais vous pouvez définir votre propre (en utilisant le code donné dans d'autres réponses):

template<class T> 
set<T> operator -(set<T> reference, set<T> items_to_remove) 
{ 
    set<T> result; 
    std::set_difference(
     reference.begin(), reference.end(), 
     items_to_remove.begin(), items_to_remove.end(), 
     std::inserter(result, result.end())); 
    return result; 
}