La structure de données d'ensemble STL C++ a-t-elle un opérateur de différence d'ensemble?C++ Différence d'ensemble STL
Répondre
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.
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);
Apparemment, il le fait.
Pas un « opérateur » dans le sens de la langue, mais il est l'algorithme de set_difference dans la bibliothèque standard:
http://www.cplusplus.com/reference/algorithm/set_difference.html
Bien sûr, les autres opérations de réglage de base sont présents aussi - (union etc), comme suggéré par la section "Voir aussi" à la fin de l'article lié.
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
.
+1. Malheureusement, quand j'en avais besoin, j'ai abandonné et lancé ma propre boucle :( – peterchen
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
#include
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()));
ou simplement utiliser' std :: inserter (result, result.end()) ' – rlbond
pouvons-nous simplement utiliser
set_difference(set1.begin(), set1.end(), set2.begin(). set2,end(),std::back_inserter(result)).
' 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
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.
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;
}
Il est utilisable sur _any_ paire de conteneurs triés. – xtofl
Bon point ... J'ai ajouté une note dans les modifications. –