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 :

Vector et find() ?


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 11
    Points
    11
    Par défaut Vector et find() ?
    Voilà mon problème:

    J'ai une liste de commandes possibles (enregistrées dans un Vector)
    l'utilisateur en entre une au clavier et je eux tester si elle existe
    dans le Vector avant de faire l'action...

    Voici le code:
    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
     
    [...]
     
    std::vector<char> vectorCommands;
    std::vector<char>::iterator vectorP;
     
    //Vecteur des commandes
    char str[] = {'powr','test'};
    unsigned int i;
    for(i = 0; i < strlen(str); i++)
        vectorCommands.push_back(str[i]);
     
    //regarder si la commande existe
    vectorP = find(vectorCommands.begin(), vectorCommands.end(), commandeEntree);	
     
    if(???){
     
    [...]
    Comment Faire ? Mon code ne compile pas

    Merci

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    Bonjour,

    Si le caractère se trouve dans ton vecteur find retournera un itérateur qui pointera sur la position de la première occurrence du caractère dans le vecteur. Si le caractère est introuvable il retournera vectorCommands.end().

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Peut-être un std::set serait plus approprié ?

    MAT.

  4. #4
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 765
    Points
    765
    Par défaut
    Sans le message d'erreur on ne peut pas faire grand chose.
    Ceci dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char str[] = {'powr','test'};
    ... ça m'étonnerai que ça soit judicieux. Si tu utilises les simple quote : '...', tu dis au compilateur que ce qu'il y a entre les deux quotes est un caractère, c'est à dire une seul lettre.
    Du coup, 'powr' n'est pas un caractère, pas plus que 'test'. Si ton compilateur est bien configuré, il doit faire un warning sur cette ligne là, exemple avec GCC :
    warning : multi-character character constant
    Si tu veux stoquer plusieurs chaines de caractère dans un tableau, il faut utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const char* srt[] = {"powr","test"};
    unsigned int i;
    for(i = 0; i < 2; i++)
        vectorCommands.push_back(str[i]);
    ... ou mieux, les mettre directement dans ton vector :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vectorCommands.push_back("powr");
    vectorCommands.push_back("test");

  5. #5
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Pourquoi char ? Et pas std::string, tout simplement ?
    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
     
    std::vector<std::string> vectorCommands;
    vectorCommands.push_back("powr");
    vectorCommands.push_back("test");
     
    std::string commandeEntree = "entree";
     
    std::vector<std::string>::cons_iterator iter = std::find(vectorCommands.begin(), vectorCommands.end(), commandeEntree);
     
    if (iter != vectorCommands.end() )
    {
        std::cout << " Found ! " << std::endl;
    }
    else
    {
        std::cout << " NOT Found ! " << std::endl;
    }

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Ceci dit, il faut prendre une chose importante en compte lorsque l'on essaye d'utiliser find sur un vecteur:

    Sa spécialisation effectue une recherche dichotomique.

    Cela implique deux choses (la deuxième découlant naturellement de la première):
    1. que les éléments du tableaux soient triés sur base de la valeur (calculée ou "fixe) qui sert pour la recherche
    2. que l'opérateur < ou qu'un prédicat similaire soit (re)défini pour assurer la comparaison
    En outre, il ne faut pas oublier le fait que tout ajout d'un élément au vecteur est susceptible de... nécessiter une nouvelle étape de tri

    Au final, la proposition de Mat est, en définitive, assez tentante, même si on pourrait rajouter std::map à la liste des collections potentiellement intéressantes

  7. #7
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    OK Koala, mais là je crois que le posteur cherche basiquement une solution qui marche, plutôt qu'un truc hyper optimisé. Vue le niveau de la demande... No offense, hein ! C'est juste pour situer le débat !
    vector n'est sûrement pas le meilleur choix de conteneur, mais ça reste le plus accessible aux communs des mortels débutants programmeurs, non ?

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Citation Envoyé par poukill Voir le message
    OK Koala, mais là je crois que le posteur cherche basiquement une solution qui marche, plutôt qu'un truc hyper optimisé. Vue le niveau de la demande... No offense, hein ! C'est juste pour situer le débat !
    vector n'est sûrement pas le meilleur choix de conteneur, mais ça reste le plus accessible aux communs des mortels débutants programmeurs, non ?
    Pas forcément au vu de ce que cela implique, ou de l'efficacité de la recherche.

    Comprend moi: l'utilisation d'un std::set n'est pas plus compliquée que celle d'un std::vector, vu que l'interface est sensiblement identique.

    Par contre, si on a le choix entre avoir un comportement dont la complexité est en O= n (pour un tableau non trié), un autre dont la complexité peut être en O=log(n) mais à condition de s'assurer d'invoquer un comportement supplémentaire (le tri), et un troisième pour lequel la complexité est garantie en O=log(n) sans rien avoir à faire de plus pour y arriver, il me semble vraiment intéressant de se questionner sur ce que l'on préfère utiliser, que l'on soit débutant ou non

    D'ailleurs, le choix de la bonne collection en fonction de l'usage qui sera fait des éléments qu'elle contient est, pour ainsi dire, un "problème universel" (comprend : que l'on rencontre quel que soit le langage impératif séquentiel envisagé)

    Car, ne nous y trompons pas: à partir du moment où l'on envisage de permettre la recherche et / ou le tri d'une (dans une) collection d'objets, les prérequis que doivent présenter ces objets restent sensiblement pareil et tiennent en quelques mot: la présence d'opérateur de comparaison ou de prédicats adaptés

  9. #9
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Effectivement, tu m'as convaincu. J'avais au début pensé que l' operator< serait un "nouveau truc" pour le posteur, mais au final il faudra bien y venir un jour... ^^

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 11
    Points
    11
    Par défaut merci
    j'ai utilisé ta solution poukill et ça marche, merci !

    Par contre j'ai une cinquantaine de commandes à entrer, il n'y a pas plus court que:

    vectorCommands.push_back("powr"); ?

  11. #11
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Ca dépend où sont ces commandes ?
    Si elles sont dans tête ou sur un papier, faut bien les rentrer un joue dans ton programme. Si elles sont ailleurs, tu peux faire une boucle for pour les copier dedans !

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Les commandes sont dans une doc du constructeur...
    Donc je vais devoir les tapper a la main...

    Mais j'aimerais une solution plus "propre" que cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    vectorCommands.push_back("powr");
    vectorCommands.push_back("swvr");
    vectorCommands.push_back("lrm1");
    vectorCommands.push_back("rem1");
    vectorCommands.push_back("lrm2");
    vectorCommands.push_back("lrm3");
    vectorCommands.push_back("lrm4");
    vectorCommands.push_back("tst0");


    et peut etre qui prendrait moins de place dans mon cpp (énumération ?)

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 69
    Points : 142
    Points
    142
    Par défaut
    Si tu connais à l'avance la liste des commandes possibles, tu peux les initialiser dans un char[] de taille fixe, stocké à la compilation, et parcourir ce tableau dans une boucle for en stockant chacun de ses éléments.


    Bientôt, le C++11 permettra d'initialiser un vecteur (et d'une manière générale les types autres que POD) à la compilation. Mais pas pour l'instant...

Discussions similaires

  1. fonction find et vector ? [c++]
    Par panthere noire dans le forum Débuter
    Réponses: 6
    Dernier message: 29/07/2010, 10h27
  2. find avec un vector de pair
    Par Pg043 dans le forum SL & STL
    Réponses: 12
    Dernier message: 05/11/2009, 17h18
  3. vector et find, find_if
    Par thhomas dans le forum SL & STL
    Réponses: 7
    Dernier message: 13/05/2009, 10h11
  4. find sur un vector qui contient une structure
    Par kunda dans le forum SL & STL
    Réponses: 14
    Dernier message: 28/04/2009, 21h35
  5. find sur le vector
    Par LeXo dans le forum SL & STL
    Réponses: 17
    Dernier message: 12/02/2008, 14h18

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