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 :

std find sur un vecteur


Sujet :

SL & STL C++

  1. #1
    Membre régulier
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Points : 99
    Points
    99
    Par défaut std find sur un vecteur
    Bonjour,

    Ou je suis trop fatigué, ou alors je vois pas où se trouve le problème :o

    J'ai ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::vector<unsigned int> xbroadcasting_list;
    Ainsi qu'une structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        struct map__
        {
            xbroadcasting_list broadcast;
        };
    M'aintenant je tente de supprimer un element de ce vecteur...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                game::map__& old_map = //....
                old_map.broadcast.erase(std::find(std::begin(old_map.broadcast),
                                                  std::end(old_map.broadcast),
                                                  m_client_socket.getHandle()) // getHandle est de type unsigned int.
                                        );
    Et voici ce que C::B me retourne...
    D:\C++\projects\Servers\Shared\Handler\PlayerChannelPacketHandler.cpp|37|warning: unused parameter 'packet' [-Wunused-parameter]|
    D:\C++\projects\Servers\Shared\Handler\PlayerChannelPacketHandler.cpp||In member function 'const PacketHandler::post_handle PlayerChannelPacketHandler::use_portal(iopacket::Reader&)'
    D:\C++\projects\Servers\Shared\Handler\PlayerChannelPacketHandler.cpp|92|error: no matching function for call to 'find(std::vector<unsigned int>::iterator, std::vector<unsigned int>::iterator, unsigned int)'|
    D:\C++\projects\Servers\Shared\Handler\PlayerChannelPacketHandler.cpp|92|note: candidate is
    c:\mingw\bin\..\lib\gcc\mingw32\4.7.2\include\c++\bits\streambuf_iterator.h|371|note: template<class _CharT2> typename __gnu_cxx::__enable_if<std::__is_char<_CharT2>::__value, std::istreambuf_iterator<_CharT2, std::char_traits<_CharT> > >::__type std::find(std::istreambuf_iterator<_CharT2, std::char_traits<_CharT> >, std::istreambuf_iterator<_CharT2, std::char_traits<_CharT> >, const _CharT2&)|
    c:\mingw\bin\..\lib\gcc\mingw32\4.7.2\include\c++\bits\streambuf_iterator.h|371|note: template argument deduction/substitution failed
    D:\C++\projects\Servers\Shared\Handler\PlayerChannelPacketHandler.cpp|92|note: '__gnu_cxx::__normal_iterator<unsigned int*, std::vector<unsigned int> >' is not derived from 'std::istreambuf_iterator<_CharT2, std::char_traits<_CharT> >'|
    ||=== Build finished: 1 errors, 1 warnings (0 minutes, 2 seconds) ===|

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Bonjour à toi
    tu t'embrouilles entre les algorithmes et les membres de vector.

    Tu devrais plutot utiliser std::remove(vector.begin(), vector.end(), value);
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    Citation Envoyé par DakM Voir le message
    Bonjour,

    Ou je suis trop fatigué, ou alors je vois pas où se trouve le problème :o

    J'ai ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::vector<unsigned int> xbroadcasting_list;
    Ainsi qu'une structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        struct map__
        {
            xbroadcasting_list broadcast;
        };
    M'aintenant je tente de supprimer un element de ce vecteur...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                game::map__& old_map = //....
                old_map.broadcast.erase(std::find(std::begin(old_map.broadcast),
                                                  std::end(old_map.broadcast),
                                                  m_client_socket.getHandle()) // getHandle est de type unsigned int.
                                        );
    Et voici ce que C::B me retourne...

    t'as pas tout simplement oublié #include <algorithm> ?

    Sinon à part cela, ton code est dangereux et ne fera pas forcément ce que tu espère : std:find renvoie un itérateur à la position de l'élement trouvé, s'il est trouvé, sinon elle te renvoie l'itérateur que tu as fourni en argument "last".

    Autrement dit, à chaque fois que tu essaiera de supprimer un élément, s'il n'existe pas, tu supprimeras le dernier de ton vector.

    Enfin, je ne sais pas si std:remove est la bonne solution également. N'oublies pas que std:remove va supprimer toutes les valeurs égales à value qu'il trouve.. si tes "handles" sont à Id unique, ça posera pas de problème, mais vaut mieux que tu sois sur de ce que tu fais

    Egalement, tu peux éviter d'utiliser les "__" dans tes noms de structure, de classe, ou d'attributs, etc, car ce sont des nomenclatures réservées au compilateur, et ça risquerait de créer des conflits.
    Nullius in verba

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Citation Envoyé par Kaamui Voir le message
    Egalement, tu peux éviter d'utiliser les "__" dans tes noms de structure, de classe, ou d'attributs, etc, car ce sont des nomenclatures réservées au compilateur, et ça risquerait de créer des conflits.
    Pour éviter ca, il suffit d'ajouter un namespace, éventuellement anonyme, et d'utiliser des noms normaux.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Remarque: ce n'est peut-être pas le cas ici, mais en général, la bonne façon de supprimer des éléments d'un conteneur de la stl c'est en utilisant le erase-remove idiom
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  6. #6
    Membre régulier
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Points : 99
    Points
    99
    Par défaut
    @Kaamui:

    Algorithm: non

    Pour le find, ne t'inquietes pas, l'element EST dans la map, obligatoirement !
    De plus, le handle est unique, c'est un numéro de socket !
    Enfin, la struct map__ se trouve dans un namespace nommé correctement, donc aucun soucis de ce côté également !

    Citation Envoyé par r0d Voir le message
    Remarque: ce n'est peut-être pas le cas ici, mais en général, la bonne façon de supprimer des éléments d'un conteneur de la stl c'est en utilisant le erase-remove idiom
    @r0d:
    Merci pour ca !
    Le code compile niquel, je vais le tester bientôt !

  7. #7
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    Si je te demandais ça c'est parce que pour moi rien ne cloche dans ton code (en tout cas à part ce que moi et les autres avons déjà dit).

    J'ai vérifié et je te confirme que tout va bien avec le code ci dessous. Du coup il ne reste que l'oubli d'inclure le header contenant la déclaration de std::find, ce qui explique le message 'call to undefined'

    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
     
    #include <vector>
    #include <algorithm>
    #include <iostream>
     
    typedef std::vector<unsigned int> uiVector;
     
    struct MyStruct
    {
        uiVector myVec;
    };
     
    void printVector(MyStruct s)
    {
        for (auto i : s.myVec)
            std::cout << i << " ";
        std::cout << std::endl;
    }
     
    int main()
    {
        MyStruct s;
        s.myVec = {10,20,30,40,50,20,30,50,60};
     
        s.myVec.erase(std::find(s.myVec.begin(),s.myVec.end(),50));
     
        printVector(s);
     
        return 0;
    }
     
     
    //Output :
    10 20 30 40 20 30 50 60
    Néanmoins, dans ton cas utiliser l'idiome "erase-remove" est adapté donc suis les conseil de r0d ^^

    @+
    Nullius in verba

  8. #8
    Membre expert

    Avatar de germinolegrand
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2010
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2010
    Messages : 738
    Points : 3 892
    Points
    3 892
    Par défaut
    Citation Envoyé par leternel Voir le message
    Bonjour à toi
    tu t'embrouilles entre les algorithmes et les membres de vector.

    Tu devrais plutot utiliser std::remove(vector.begin(), vector.end(), value);
    La méthode consacrée est begin(vector) et end(vector) car elle est plus générique.

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    En effet, merci, j'avais oublié.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

Discussions similaires

  1. [Struts] Problème pour itérer sur un vecteur
    Par vallica dans le forum Struts 1
    Réponses: 5
    Dernier message: 24/04/2006, 15h45
  2. Réponses: 7
    Dernier message: 18/04/2006, 17h44
  3. probleme std::find
    Par voyageur dans le forum SL & STL
    Réponses: 2
    Dernier message: 07/05/2005, 20h55
  4. std::sort() sur std::vector()
    Par tut dans le forum SL & STL
    Réponses: 20
    Dernier message: 05/01/2005, 19h15
  5. Zoom sur des vecteurs ou lignes
    Par mat.M dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 25/11/2002, 10h40

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