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

C++ Discussion :

Optimisation de comparaison de chaines


Sujet :

C++

  1. #21
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Par défaut
    re,
    merci pour vos réponses.
    En me basant sur l'idée de Koala , j'ai fait quelque chose de similaire

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    //mes parametres
    std::string const paramNamesString[] = {"param0", "param1", "param2", "param3", "param4","tata", "titi", "toto", "tutu"};
     
    //j'affecte dans une map, un indice pour chaque parametre
        map <string , int> myMap;
     
     
    	int stringSize=sizeof(string);
    	int nbElements=sizeof(paramNamesString)/stringSize;
    	for(int i=0;i<nbElements;i++)
    	{
    		myMap.insert(pair<string, int>(paramNamesString[i],i));
    	}
     
    //ensuite dans mon switch, je le fais directement sur un entier
    int indiceParam = myMap.find(paramName)->second;
    for( k=0 ;k<...;k++ )
    			{
     
    	//Récupération de la hauteur adim
     
    	H_TAB[k]=Gr->Href[k];
     
     
    	switch(indiceParam)
    	{
    		case 0:
    			//param0
    			TAB[k]=(float)Obj->param0[k];
    			break;
     
    		case 1:
    			//param1
    			TAB[k]=(float)Obj->param1[k];
    			break;
                      ...
                       ...
    		case 5:
                        //tata
    			TAB[k]=(float)Obj->tata[k];
    			break;
    ....
     
                  }
    }
    Voila ça fonctionne mais je n'ai absolument rien gagné en vitesse

  2. #22
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    Je ne sais pas pour toi, mais chez moi les variables qui se déguisent pour se faire passer pour un autre, ça ne passe pas.
    Il faudrait dire à « b » que cela ne sert à rien de se prendre pour « it », ou l'inverse ; ça se remarque tout de suite.
    (ou pas…)
    En fait, b et e sont les abréviations (mal choisies, il est vrai ) de "begin" et de "end", qui correspondent respectivement à ce qui est renvoyé par la fonction du même nom que présentent toutes les collection proposées par la STL

    Maintenant, libre à toi de renommer b en ite(rateur) et e en end si tu le souhaite

    Ici, je montrais essentiellement le principe

    Citation Envoyé par rockt13 Voir le message
    re,
    merci pour vos réponses.
    En me basant sur l'idée de Koala , j'ai fait quelque chose de similaire

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    //mes parametres
    std::string const paramNamesString[] = {"param0", "param1", "param2", "param3", "param4","tata", "titi", "toto", "tutu"};
     
    //j'affecte dans une map, un indice pour chaque parametre
        map <string , int> myMap;
     
     
    	int stringSize=sizeof(string);
    	int nbElements=sizeof(paramNamesString)/stringSize;
    	for(int i=0;i<nbElements;i++)
    	{
    		myMap.insert(pair<string, int>(paramNamesString[i],i));
    	}
     
    //ensuite dans mon switch, je le fais directement sur un entier
    int indiceParam = myMap.find(paramName)->second;
    for( k=0 ;k<...;k++ )
    			{
     
    	//Récupération de la hauteur adim
     
    	H_TAB[k]=Gr->Href[k];
     
     
    	switch(indiceParam)
    	{
    		case 0:
    			//param0
    			TAB[k]=(float)Obj->param0[k];
    			break;
     
    		case 1:
    			//param1
    			TAB[k]=(float)Obj->param1[k];
    			break;
                      ...
                       ...
    		case 5:
                        //tata
    			TAB[k]=(float)Obj->tata[k];
    			break;
    ....
     
                  }
    }
    [/CODE]
    Cela ne sert strictement à rien:
    1. tu duplique une donnée qui n'en a pas besoin( hé oui, toutes les chaines définies dans paramNamesString sont dupliquées dans la map
    2. tu continue à utiliser chaque fois la comparaison de chaines (même si c'est l'opérateur < qui est utilisé, et même si elles sont "triées"
    3. tu rajoute à cela le temps de la recherche dans la map, qui présente à lui seul une complexité en o(log(n) ) qui ne rajoute rien au final
    Voila ça fonctionne mais je n'ai absolument rien gagné en vitesse
    Et je viens de te dire pourquoi

    Tu devrais réfléchir un peu à la signification de ma signature, ou plutôt à la version un tantinet moins humoristique de celle-ci
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #23
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 050
    Par défaut
    J'ai du mal avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for(int i=0;i<nbElements;i++)
    	{
    		myMap.insert(pair<string, int>(paramNamesString[i],i));
    	}
     
    //ensuite dans mon switch, je le fais directement sur un entier
    int indiceParam = myMap.find(paramName)->second;
    Un entier de 0 à n clé d'une string? Puis find?
    Un std::vector avec n string, l'accès à la string es réalisé avec l'opérateur [] ou at() de façon constante il me semble.

    Aussi pour chercher la mer... ++k est plus rapide que k++

  4. #24
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Par défaut
    ok j'ai fait de la merde

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    vector <string> paramVector ( paramNamesString, paramNamesString + sizeof(paramNamesString) / sizeof(string));
     
    paramVector[paramName] ou paramVector.at(paramName) ne fonctionne pas, car moi c'est l'indice correspondant que je veux et non paramVector[x] avec 0<x<nbString (x un entier)
    bon ben je vais retravailler la dessus en relisant vos conseils

  5. #25
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Citation Envoyé par Steph_ng8 Voir le message
    Je ne sais pas pour toi, mais chez moi les variables qui se déguisent pour se faire passer pour un autre, ça ne passe pas.
    Il faudrait dire à « b » que cela ne sert à rien de se prendre pour « it », ou l'inverse ; ça se remarque tout de suite.
    (ou pas…)
    En fait, b et e sont les abréviations (mal choisies, il est vrai ) de "begin" et de "end", qui correspondent respectivement à ce qui est renvoyé par la fonction du même nom que présentent toutes les collection proposées par la STL

    Maintenant, libre à toi de renommer b en ite(rateur) et e en end si tu le souhaite

    Ici, je montrais essentiellement le principe
    Oui, ça j'avais compris…
    Je voulais simplement faire remarquer que dans ton bout de code, ta variable « b » se transforme soudainement (et sans prévenir, la fourbe !) en « it ».
    Pour le cas où quelqu'un tenterait de le copier sans vraiment faire attention…

  6. #26
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    Oui, ça j'avais compris…
    Je voulais simplement faire remarquer que dans ton bout de code, ta variable « b » se transforme soudainement (et sans prévenir, la fourbe !) en « it ».
    Pour le cas où quelqu'un tenterait de le copier sans vraiment faire attention…
    Ouppsss... au temps pour moi...

    Je n'avais pas remarqué que mon code était pour le moins incohérent, vu que j'incrémentais it (qui n'existait nulle part) et non b

    Je viens de rendre la cohérence à celui-ci
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #27
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    Si tu as un nombre fini de chaines de caractères intervenant dans ParanName (ce qui semble être le cas), mais que tu en accepte un nombre plus ou moins infini, tu peux envisager de tester tous les parametres l'un à la suite de l'autre et de leur donner une valeur en fonction de la chaine de caractères rencontrées.

    Cela pourrait se faire sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    std::string const paramNamesString[]={"toto","tata","titi","var","brol","truc"
                                          /*... */};
    int maxNameStrings = /* le nombre de chaines de caractères envisagées
    int indexOfString(std::string const & s)
    {
        int ret=0;
        while(ret<maxNameStrings && s.find(paramNamesString[ret])==std::string::npos)
        ++ret;
        return ret;
    };
    Tu pourrais placer l'indice ainsi obtenu dans un tableau d'entiers, qui irait très bien pour la cause:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main(int argc, char *argv[])
    {
         std::vector<int> tab;
        if(argc>1) // si l'on a introduit des arguments
        {
            // on les passe tous en revue
            for(int i=1;i<argc;++i)
                tab.push_back(indexOfString(argv[i]);
        }
     
    }
    Il n'y a plus par la suite qu'à parcourrir ce vecteur et de décider quoi faire
    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
    template <typename iterator>
    void useParams(iterator b, iterator e)
    {
        while(b!=e)
        {
            swich(*b)
            {
                 case 0:
                     /* si c'était "toto" */
                     break
                 case 1:
                     /* si c'était "tata" */
                     break
                 case 2:
                     /* si c'était "titi" */
                     break
                 /*... */
                 default :
                     /* si ce n'était aucune des chaines envisagées */
            }
            ++b;
        }
    }
    (NOTA: j'ai créé une fonction template pour ne pas être limité à l'utilisation d'un vecteur )

    Et cette fonction, tu l'insère à ta guise dans une boucle "classique":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int i=...)
        useParams(tab.begin(), tab.end());
    Et le tour est joué

    Tu auras un "temps de latence" avant le lancement de la boucle principale (le for(int i = ...) parce qu'il faudra, quoi qu'il arrive, comparer l'ensemble des arguments passés à potentiellement la totalité des chaines de caractères envisagées, mais cela accélérera fortement ta boucle principale (toujours le for (int i=...) ) parce que tu te contentera de comparer des entiers entre eux, ce qui est particulièrement rapide

    N'oublie pas que l'on passe 90% du temps dans 10% du code... ici, la comparaison des paramètres se trouve tout à fait en dehors des 10% "critiques"

    EDIT: si tu dois compter le nombre de fois que titi, tata ou brol est utilisé, il est très facile de rajouter un compteur dans l'histoire
    ReBonjour à tous,
    En fait dans ta solution ce que je ne comprend pas c'est le useParams(tab.begin(),tab.end()) car ça signifie qu'on va traiter tous les cas du switch ? puisqu'on boucle pour parcourir tout le tableau ?

  8. #28
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par rockt13 Voir le message
    ReBonjour à tous,
    En fait dans ta solution ce que je ne comprend pas c'est le useParams(tab.begin(),tab.end()) car ça signifie qu'on va traiter tous les cas du switch ? puisqu'on boucle pour parcourir tout le tableau ?
    Cela signifie que l'on va traiter tous les paramètres qui ont été passé (de argv[1] à argv[argc-1] inclus)

    Cette fonction peut donc parfaitement n'être que la boucle qu'il te faut
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #29
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    En fait, dans sa solution, on commence par transformer tous les paramètres du programme en entier (et on les stocke), puis on analyse tous les ces entiers en une seule fois.
    Mais rien ne t'empêche de faire la transformation et l'analyse (un paramètre à la fois) dans la foulée.
    Ça évite de parcourir deux fois la liste des paramètres, donc c'est probablement (un peu) plus rapide.

  10. #30
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    En fait, dans sa solution, on commence par transformer tous les paramètres du programme en entier (et on les stocke), puis on analyse tous les ces entiers en une seule fois.
    Mais rien ne t'empêche de faire la transformation et l'analyse (un paramètre à la fois) dans la foulée.
    Ça évite de parcourir deux fois la liste des paramètres, donc c'est probablement (un peu) plus rapide.
    A vrai dire, il y a trois situations distinctes, et mon code sera vraisemblablement plus rapide dans deux d'entre elles (et de toutes manières plus rapide que le fait de comparer sans arrêt des chaines de caractères, même dans la première ):
    • Soit, on veut traiter tous les paramètres d'un coup, sans espoir de revenir dessus et, le code pourrait être amélioré en évitant de stocker les entiers.
    • Soit on souhaite gérer (une seule fois) les arguments "en temps et en heure" (comprend : lorsque le besoin s'en fait sentir, et pas avant): le fait d'avoir converti une bonne fois pour toutes les arguments en valeur entière et de les avoir stockée nous permettra d'éviter de recomparer l'ensemble des arguments passés aux chaines de caractères prévues, et nous gagnerons donc du temps.
    • Soit, enfin, nous traitons l'ensemble des arguments une première fois au lancement de l'application, mais nous avons besoin de revenir sur ce traitement par la suite. Et, là encore, le fait de les avoir stockés sous la forme d'une valeur numérique nous fera gagner du temps par la suite
    On ne le répétera jamais assez: la comparaison de deux chaines, que ce soit pour l'égalité ou non, est sans doute la comparaison qui prend le plus de temps global, pour la simple et bonne raison qu'il s'agit de parcourir l'ensemble des deux chaines au minimum jusqu'à ce qu'il y ait un caractère différents (qui peut soit ne jamais arriver, auquel cas, il y a égalité, soit arriver... lors de la comparaison du dernier caractère, dans le pire des cas)

    C'est la raison pour laquelle je préfère largement faire en sorte de me décharger une bonne fois pour toutes de ce genre de comparaison le plus tôt possible
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #31
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Vu comme ça…

  12. #32
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Par défaut
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    std::string const paramNamesString[]={"toto","tata","titi","var","brol","truc"
                                          /*... */};
    int maxNameStrings =25; /* le nombre de chaines de caractères envisagées*/
    int indexOfString(std::string const & s)
    {
        int ret=0;
        while(ret<maxNameStrings && s.find(paramNamesString[ret])==std::string::npos)
        ++ret;
        return ret;
    };
     
         std::vector<int> tab;
    //insertion des entiers unique correspondants à chaque string
         for(int i=1;i<maxNameStrings ;++i)
             tab.push_back(indexOfString(paramNamesString[i]);
     
    //Ok maintenant j'ai un vector contenant un entier pour chaque string et je peux donc faire un switch
    paramName="tata";
     
    val = useParams(tab.begin(), tab.end(),k);
     
    template <typename iterator>
    void useParams(iterator b, iterator e , int k)
    {
        while(b!=e)
        {
            swich(*b)
            {
                 case 0:
                     /* si c'était "toto" */
                     return (float)Obj->toto[k];
                     break
                 case 1:
                     /* si c'était "tata" */
                     return (float)Obj->tata[k];
                     break
                 case 2:
                     /* si c'était "titi" */
                      return (float)Obj->titi[k];
                     break
                 /*... */
                 default :
                     /* si ce n'était aucune des chaines envisagées */
            }
            ++b;
        }
    }
    En fait dans mon cas je ne veux pas parcourir tous les case possible, mais seulement aller dans "titi" ou "tata".
    Par exemple si mon paramName est "tata" je ne vois pas comment faire pour aller dans le bon switch avec ta méthode qui semble itérer sur la totalité du vecteur et donc exécuter tous les cases les un après les autres.

  13. #33
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    En fait, une fois que tu as l'ensemble des paramètres représentés par un entier, tu peux travailler exactement comme tu veux...

    Si tu veux accéder aux arguments qui utilisaient titi, tu peux parfaitement envisager d'utiliser les algorithmes find ou find_if:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /* si tu ne veux que le premier argument correspondant */
    std::vector<int>::const_iterator it=std::find(tab.begin(),tab.end,3);
    //on a l'itérateur sur le premier argument commencant par "titi"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct functor
    {
        functor(int first):first(first){}
        bool operator()(int second)const{return i==second;}
    };
    int main()
    {
        /* tout le travail préparatoire */
        functor f(0); // on va chercher "toto"
        std::vector<int>::const_iterator it=std::find_if(tab.begin(), tab.end(),f);
    }
    Pour autant que tu ne décide pas de retirer les arguments (car la suppression invalide les itérateurs), tu peux même boucler sur "while (it!=tab.end())" afin de trouver tous les arguments qui commencaient par la chaine recherchée
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  14. #34
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Par défaut
    Salut
    D'accord pour ça :

    Si tu veux accéder aux arguments qui utilisaient titi, tu peux parfaitement envisager d'utiliser les algorithmes find ou find_if:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    /* si tu ne veux que le premier argument correspondant */
    std::vector<int>::const_iterator it=std::find(tab.begin(),tab.end,3);
    //on a l'itérateur sur le premier argument commencant par "titi"
    Sauf que je suis pas censé savoir quand je reçois paramName="titi" que c'est le case 3 que je dois chercher..

  15. #35
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par rockt13 Voir le message
    Sauf que je suis pas censé savoir quand je reçois paramName="titi" que c'est le case 3 que je dois chercher..
    Heuuu, tu es quand même sensé avoir évalué clairement les paramètre que tu dois passer à ton application...

    Il peut y avoir certaines variables (ex: nom de fichier ou valeurs diverse), mais, pour ce qui est des argument (help recursive, verbose, silent, ...) tu dois en avoir dressé la liste complète et exhaustive

    Et tu es donc sensé savoir, dans ta logique, quel type de paramètre est à rechercher dans quelle situation, et donc, quel entier lui correspond
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  16. #36
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Par défaut
    Mon problème est résolu,
    La grosse lenteur provenait du fait de la récupération d'un pointeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for(k..)
    {
     
    objType obj = get(parent,k);
     
    }
    il fallait récupérer une référence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    objType& obj = get(parent,k);
    Car le fait de ne pas récupérer une référence, entrainer une copie à la volée, maintenant le chargement est quasi instantané.

    Merci à tous pour votre aide , je garde sous le coude toutes vos astuces et remarques.

  17. #37
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    C'est quoi ton compilo?

  18. #38
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Citation Envoyé par rockt13 Voir le message
    En fait dans mon cas je ne veux pas parcourir tous les case possible, mais seulement aller dans "titi" ou "tata".
    Par exemple si mon paramName est "tata" je ne vois pas comment faire pour aller dans le bon switch avec ta méthode qui semble itérer sur la totalité du vecteur et donc exécuter tous les cases les un après les autres.
    Dans la solution de koala01, la variable « paramName » n'a plus de raison d'être.
    Encore une fois, tous les paramètres du programme sont transformés en entiers en une seule fois :
    Citation Envoyé par koala01 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::vector<int> tab;
    if(argc>1) // si l'on a introduit des arguments
    {
        // on les passe tous en revue
        for(int i=1;i<argc;++i)
            tab.push_back(indexOfString(argv[i]));
    }
    Du coup, dorénavant on se fiche complètement du nom des paramètres, et on se concentre uniquement sur les entiers qui leur correspondent.

    Maintenant, la fonction qui analyse les paramètres (transformés en entiers) :
    Citation Envoyé par koala01 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <typename iterator>
    void useParams(iterator b, iterator e , int k);
    On lui passe en paramètre un intervalle de valeurs [b,e[ qui sera intégralement passé en revue.
    Cet intervalle peut contenir tous les paramètres, une partie des paramètres, un seul paramètre, ou être vide…

    Après, rien ne t'empêche de l'adapter pour n'analyser qu'un paramètre à la fois, si c'est plus pratique pour toi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void useParam(int param, int k);
    Voire, si tu n'analyses les paramètres qu'une seule fois en tout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void useParam(const std::string& param, int k)
    {
        switch (indexOfString(param)) {
            (...)
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Méthode optimisée de comparaison de donnees
    Par yoghisan dans le forum Langage
    Réponses: 5
    Dernier message: 30/08/2005, 12h46
  2. [langage] Comparaison de chaîne
    Par Fastshadow dans le forum Langage
    Réponses: 7
    Dernier message: 05/09/2004, 19h58
  3. comparaison de chaines de caracteres en PLSQL
    Par biozaxx dans le forum PL/SQL
    Réponses: 3
    Dernier message: 19/08/2004, 10h41
  4. Comparaison de chaines
    Par Marc_P dans le forum Linux
    Réponses: 6
    Dernier message: 17/02/2004, 18h04
  5. [LG]comparaison de chaines de caracteres
    Par thesam dans le forum Langage
    Réponses: 6
    Dernier message: 20/05/2003, 23h41

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