73 votes

c++ STL set différence

La structure de données set de la STL C++ dispose-t-elle d'un opérateur de différence de set ?

145voto

PierreBdR Points 11479

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 .

0 votes

+1. Malheureusement, quand j'en ai eu besoin, j'ai abandonné et j'ai créé ma propre boucle :(

48 votes

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

4 votes

include <algorithms> -> No such file, should be <algorithm> ?

11voto

Mr Fooz Points 21092

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.

1 votes

Il est utilisable sur cualquier paire de conteneurs triés.

4voto

philsquared Points 13547

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.

3voto

astraujums Points 280

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

2voto

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

Au lieu de

#include <algorithms>

utiliser

#include <algorithm>

Au lieu de

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

utiliser

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

Prograide.com

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.

Powered by:

X