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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    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 expérimenté
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    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 Expert

    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
    Par défaut
    Salut,

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

    MAT.

  4. #4
    Membre chevronné

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

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    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 Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    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
    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
    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
    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. #7
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    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
    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 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
    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

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