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 :

set_intersection taille du vector résultat prédéterminé obligatoire ?


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut set_intersection taille du vector résultat prédéterminé obligatoire ?
    Bonjour,
    Je souhaite faire l'intersection de deux set:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    set<int> set1,set2;
    /*
    remplissage des sets
    */
    vector<int> result;
    set_intersection(set1.begin(),set1.end(),set2.begin(),set2.end(),result.begin());
    Ce code compile mais plante à l'exécution car l'espace mémoire n'a pas été alloué pour result.
    On peut donc l'initialiser de cette façon par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result(min(set1.size(),set2.size()),-1);
    En effet, l'intersection sera au plus de la taille du plus petit des 2 sets.
    Seulement je ne trouve pas cela très propre : je souhaiterai avoir un vector result dont la taille correspond réellement à l'intersection.


    Est il possible de faire cela sans avoir calculer 2 fois l'intersection ?
    Merci

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,
    Tu peux utiliser un back_inserter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #include <iterator> // pour back_inserter
     
    set<int> set1,set2;
     
    /*
    remplissage des sets
    */
     
    vector<int> result;
    result.reserve(std::min(set1.size(), set2.size());
     
    set_intersection(set1.begin(), set1.end(),
                     set2.begin(),set2.end(),
                     std::back_inserter(result));
    Edit : Petite précision, std::back_inserter possède l'inconvénient d'insérer les élements un par un, par push_back(). C'est pour ça que j'ai rajouté un reserve() juste avant, histoire d'éviter de subir des réallocations+copies à chaque fois que la capacité est atteinte.

    Donc au final, après le set_intersection on aurait :
    v.size() = nombre d'element dans l'intersection
    v.capcity() = min(s1.size(), s2.size());

  3. #3
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Merci beaucoup c'est ce qu'il me fallait

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/01/2015, 22h09
  2. Réponses: 0
    Dernier message: 25/01/2015, 18h44
  3. Taille de vector
    Par Nikolai dans le forum C++
    Réponses: 6
    Dernier message: 05/09/2009, 15h07
  4. [SQL-Server] Taille limite des résultats d'une requête
    Par AllezTFC dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 23/05/2008, 21h03
  5. Taille résultat requete
    Par guano dans le forum Requêtes
    Réponses: 1
    Dernier message: 07/07/2005, 23h24

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