IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

Intersection et Union de conteneurs


Sujet :

SL & STL C++

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut Intersection et Union de conteneurs
    Bonjour à tous,
    Quoi de neuf depuis le crash ?

    Venons-en au vif du sujet:
    Existe-t-il une fonction template ou (autre) permettant de construire l'intersection (l'union aussi) de deux conteneurs ?
    Par exemple, à partir de deux std::vector du même type et triés suivant le même critère, je voudrais obtenir un std::vector qui contiendrait les éléments communs (l'intersection donc dans ce cas).
    Merci.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Oui, std::set_intersection et std::set_union dans <algorithm>.

  3. #3
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    N'oublie pas que tes vecteurs doivent être triés pour que l'utilisation de ces deux fonctions marchent.

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Super, ça marche, merci !
    Juste le cinquième paramètre, il est un peu spécial: std::inserter.
    Merci encore.

  5. #5
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Pas forcément, quand tu connais déjà le résultat à l'avance, et donc que tu as assez de place, un itérateur tout con suffit .

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    En effet, si on connait la taille du résultat à l'avance (ou une borne supérieure), c'est une bonne optimization.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    l'inserter est fait justement quand tu ne connais pas le résultat.

    Pour un vecteur, tu peux utiliser un back_inserter:

    std::back_inserter( v )

    qui va simplement ajouter les élements dans v avec push_back()

  8. #8
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Le push_back fait quand même des réallocations de mémoire.

    Mais c'est intéressant ce que tu dis-là. Quelle différence entre std::inserter et std::back_inserter avec des vector ? En tout cas, en toute logique, le vector résultat doit être trié comme les deux vector entrants. D'après mes essais c'est bien le cas avec std::inserter.

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Citation Envoyé par camboui Voir le message
    Le push_back fait quand même des réallocations de mémoire.
    peut-être mais dans la plupart des cas ce sera transparent. De toute façon tu ne peux pas connaître à l'avance le résultat de ton intersection.

    Mais c'est intéressant ce que tu dis-là. Quelle différence entre std::inserter et std::back_inserter avec des vector ?
    inserter utilisera la méthode "insert()" du container, back_inserter utilisera "push_back()". ( front_inserter utilisera push_front() ).

    L'avantage de l'"inserter", c'est qu'il est commun à plusieurs containers de la SL.

    En tout cas, en toute logique, le vector résultat doit être trié comme les deux vector entrants. D'après mes essais c'est bien le cas avec std::inserter.
    Ben le vector résultat est vide au début. Après le résultat est trié. Tu n'as rien à faire.

    Mais cette notion d'inserters est importante pour comprendre la logique d'autres algorithmes comme transform(), copy(), remove_copy_if() etc..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Intersection et union de tableaux
    Par 0.GeGe.0 dans le forum Langage
    Réponses: 2
    Dernier message: 16/05/2014, 17h25
  2. vue "union" de conteneurs
    Par CedricMocquillon dans le forum C++
    Réponses: 8
    Dernier message: 02/05/2012, 14h46
  3. Réponses: 8
    Dernier message: 27/11/2006, 16h46
  4. Minus,intersect,union et vue avec sql server 2000
    Par donny dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 22/02/2006, 07h46
  5. intersection et union d'une pile
    Par harris_macken dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 20/10/2005, 09h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo