La structure de données set de la STL C++ dispose-t-elle d'un opérateur de différence de set ?
+1. Malheureusement, quand j'en ai eu besoin, j'ai abandonné et j'ai créé ma propre boucle :(
La structure de données set de la STL C++ dispose-t-elle d'un opérateur de différence de set ?
Oui, il y en a un, il est dans <algorithm>
et s'appelle : std::set_difference
. L'usage 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()));
Au final, l'ensemble result
contiendra le s1-s2
.
+1. Malheureusement, quand j'en ai eu besoin, j'ai abandonné et j'ai créé ma propre boucle :(
BTW, si vous utilisez set_difference sur une classe de conteneur non-associatif, disons un vecteur, assurez-vous que les éléments des deux conteneurs sont triés en premier...
Oui, il y a un set_difference dans l'en-tête des algorithmes.
Edits :
Pour info, la structure de données set est capable d'utiliser efficacement cet algorithme, comme indiqué dans son documentation . L'algorithme ne fonctionne pas seulement sur les ensembles mais sur toute paire d'itérateurs sur des collections triées.
Comme d'autres l'ont mentionné, il s'agit d'un algorithme externe, et non d'une méthode. On peut supposer que cela convient à votre application.
Ce n'est pas un "opérateur" au sens du langage, mais il existe l'algorithme set_difference dans la bibliothèque standard :
http://www.cplusplus.com/reference/algorithm/set_difference.html
Bien entendu, les autres opérations de base sur les ensembles sont également présentes (union, etc.), comme le suggère la section "See also" à la fin de l'article.
Le C++ ne définit pas d'opérateur de différence d'ensemble mais vous pouvez définir le vôtre (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;
}
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.