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 :

question sur set_intersection


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut question sur set_intersection
    Salut,

    Je veux l'utiliser pour faire l'intersection entre 2 std::set<std::string> dont les tailles sont par exemple 3 et 4. Ma question concerne l'iterateur de résultat qu'on donne en 5ème argument à la fonction.
    J'ai créé un résultat std::set<std::string> result;
    Dois-je redimensionner result en prévoyant une taille maximale de 3 ou bien je peux me contenter de donner result.begin() et il se débrouillera tout seul pour y insérer des éléments ?

    Merci

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    je ne suis pas trés à l'aise avec set_intersection, mais le code suivant pourra peut-être t'aider:
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    //je commence par remplir 2 sets s1 et s2
    std::set<std::string> s1;
    s1.insert("toto");
    s1.insert("titi");
    s1.insert("tata");
     
    std::set<std::string> s2;
    s2.insert("tutu");
    s2.insert("toto");
    s2.insert("titi");
    s2.insert("tyty");
     
    // je prépare s3 qui va récupérer le résultat le l'intersection.
    std::set<std::string> s3;
    // je copie le plus grand set (entre s1 et s2) dans s3
    s3 = ( s1.size()>s2.size() ) ? s1 : s2;
    // je remplis s3 de chaînes vide
    std::fill(s3.begin(), s3.end(), "");
     
    // j'applique set_intersection
    std::set<std::string>::iterator it = std::set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), s3.begin() );
     
    //je "retaille" s3 de façon à ce que les éléments superflux soient supprimés
    std::set<std::string>(s3.begin(), it ).swap(s3);
    Pour répondre à ta question: oui, il faut pré-allouer le set dans lequel tu vas mettre le résultat.

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Merci, ça répond effectivement parfaitement à ma question.
    En fait pour ce cas précis je me fous complètement de connaître l'intersection, tout ce qui m'intéresse c'est de savoir si elle est vide ou pas. C'est pourquoi je trouve assez rébarbatif de devoir faire autant de choses sur une variable que je n'utilise pas en fin de compte... Connaissez vous un façon aussi fiable mais plus directe d'obtenir l'info ?

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Si j'ai bien compris, tu veux juste tester s'il existe au moins un élément commun entre deux conteneurs.
    Si c'est le cas, je pense que le plus simple est d'utiliser la fonction find_first_of (déclarée, à l'instar de set_intersection, dans l'en-tête <algorithm>):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    std::set<std::string> s1;
    std::set<std::string> s2;
     
    //... remplissage de s1 et s2
     
    std::set<std::string>::iterator it = std::find_first_of(s1.begin(), s1.end(), s2.begin(), s2.end() );
    if (it==s1.end()) // si (it==s1.end()) cela signifie qu'aucun élément n'est commun à s1 et s2
    {
    //code
    }
    else // sinon cela signifie qu'il existe au moins 1 élément commun
    {
    //code
    }
    Hope it helps.

  5. #5
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Citation Envoyé par r0d Voir le message
    Si j'ai bien compris, tu veux juste tester s'il existe au moins un élément commun entre deux conteneurs.
    Oui c'est ça. Je suppose que la version find_first_of est plus efficace...

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Beaucoup plus efficace en effet, et plus simple à écrire

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

Discussions similaires

  1. [debutant] Questions sur 1 futur projet
    Par cyrull22 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 28/04/2003, 21h49
  2. Quelques questions sur le TWebBrowser...
    Par CorO dans le forum Web & réseau
    Réponses: 3
    Dernier message: 17/01/2003, 21h23
  3. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  4. Réponses: 2
    Dernier message: 11/08/2002, 21h27
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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