C++ set Recherche dans 2 sets :)

Résolu
velderama Messages postés 203 Statut Membre -  
velderama Messages postés 203 Statut Membre -
Bonjour,

Je debute par rapport aux Stl et j'aimerai trouver les mots presents a la fois dans les 2 set (s et s2)
Pour cela j'ai une fonction qui prend 2 arguments de type set et qui affiche les mots
presents dans les 2...(jespere que vous suiviez ;) )

J'ai :
void presence(set<string> &s,set<string> &s2){
         
    for ( set<string>::iterator it = s.begin(); it != s.end(); ++it )
	{
        cout<<"Mot dans les 2 :"<<endl;

        if( s2.find(it) != s2.end){  //si on a trouve le mot
         
                          cout<<" "<<*it<<end;//afficher le mot
        
                                    }//fi
        
         }//for
    
    
}


Et la j'ai des doute je suis meme sur ca ne passe pas ! Ai-je oublié quelque chose?

Merci
--
ps: n'oubliez pas de cocher "probleme resolu " si c'est le cas ^_^

4 réponses

  1. velderama Messages postés 203 Statut Membre 10
     
    Quelqu'un n'aurait-il pas une idée de ma faille?
    0
  2. velderama Messages postés 203 Statut Membre 10
     
    1 autre question : (rien a voir je suis d'accord !)

    -Les templates ca sert essentiellement a quoi?
    0
  3. velderama Messages postés 203 Statut Membre 10
     
    Hello,
    vous allez pas me croire... j'ai passé 2 heures avant de voir le probleme ! ;) (meme pas mal :p)

    En fait j'ai oublié de faire *it et aussi les parentheses dans end

    au final
    void presence(set<string> &s,set<string> &s2){
             
        for ( set<string>::iterator it = s.begin(); it != s.end(); ++it )
    	{
            cout<<"Mot dans les 2 :"<<endl;
    
            if( s2.find(*it) != s2.end()){  //si on a trouve le mot
             
                              cout<<" "<<*it<<end;//afficher le mot
            
                                        }//fi
            
             }//for
        
        
    }


    Par contre pour les templates...si kelkun a une idée?
    0
  4. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Il faut faire deux find (un dans chaque set). Un find qui ne trouve pas retourne l'iterator end()
    https://community.hpe.com/t5/custom/page/page-id/HPPSocialUserSignonPage?redirectreason=permissiondenied&referer=https%3A%2F%2Fcommunity.hpe.com%2Ft5%2FServers-Systems-The-Right%2FSGI-com-Tech-Archive-Resources-now-retired%2Fba-p%2F6992583

    Exemple :
    #include <set>
    #include <iostream>
    #include <string>
    
    int main(){
      std::set<std::string> s1,s2:
      s1.insert("tapir");
      s1.insert("guepard");
      s1.insert("girafe");
      s2.insert("tapir");
      s2.insert("lion");
      s2.insert("gazelle");
    
      const std::string s = "tapir";
      if(s1.find(s) != s1.end() && s2.find(s) != s2.end()){
        std::cout << s << " est dans s1 et s2" << std::endl;
      }else{
        std::cout << s << " n'est pas dans s1 et s2" << std::endl;
      }
      return 0;
    }
    

    Si tu dois faire beaucoup de vérification de ce genre il est a priori plus rentable de construire d'abord l'intersection de s1 et s2 puis faire la recherche dans cet ensemble
    std::set<std::string> s1_s2;
    std::set<std::string>::const_iterator
      sit (s1.begin()),
      send(s1.end());
    for(;sit!=send;++sit){
      const std::string & s = *sit;
      if(s2.find(s) != s2.end()) s1_s2.insert(s);
    }
    
    // s1_s2.find("tapir") == s1_s2.end() ?

    Bonne chance
    0