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 :

[C++14] Les itérateurs


Sujet :

C++

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Points : 162
    Points
    162
    Par défaut [C++14] Les itérateurs
    Bonjour à tous , je suis acctuellement entrain de créé un petit jeu et j'en suis dans la partie application des texture sur des entités.
    Donc j'ai dans mon main ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::map<std::string,sf::Texture> globalTexture;
    std::vector<std::unique_ptr<Entity>> globalEntity;
    Et pour appliquer les texture j'ai essayer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void addMobs( std::string name, std::vector<std::unique_ptr<Entity>> &v_entity, std::map<std::string,sf::Texture> const &m_texture )
    {
        for(m_texture::/*const_*/iterator it=m_texture.begin() ; it!=m_texture.end() ; ++it)
        {
            if ( *it.first == name );
            {
                auto e = std::make_unique<Entity>( *it.second, sf::Vector2f(100,100) );
                v_entity.push_back( std::move(e) );
            }
        }
    }
    Mais le problème et que ça ne fonctionne pas car je m'y connais pas trop avec les itérateur x).
    J'ai ces deux erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    B:\Workspace\C++\Gravity\Function.cpp|12|error: 'm_texture' is not a class, namespace, or enumeration|
    B:\Workspace\C++\Gravity\Function.cpp|12|error: 'it' was not declared in this scope|
    J'avais pourtant vu ce code " for(m_texture::/*const_*/iterator it=m_texture.begin() ; it!=m_texture.end() ; ++it)" dans un exemple d'un post sur le forum, mais ça n'as pas l'aire de fonctionné chez moi x)
    Quelqu'un peux m'aider ?
    Merci ^^

  2. #2
    Membre habitué
    Homme Profil pro
    sans activité
    Inscrit en
    Janvier 2016
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : sans activité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 76
    Points : 136
    Points
    136
    Par défaut
    Bonjour Disixlis,

    le m_texture::iterator est étonnant, je ne dis pas qu'il est faux mais... est faux. (merci VivienD)

    Essaie avec std::map<std::string,sf::Texture>::iterator ou encore plus simple auto
    sinon, au lieu de faire *it.first fais plutôt it->first
    Edit:

    Tu peux aussi remplacer ta boucle par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    auto it = m_texture.find(name);
    if(it != m_texture.end())
    {
                auto e = std::make_unique<Entity>( it->second, sf::Vector2f(100,100) );
                v_entity.push_back( std::move(e) );
     }

  3. #3
    Membre émérite
    Avatar de VivienD
    Homme Profil pro
    Développeur logiciel
    Inscrit en
    Octobre 2009
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur logiciel
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 523
    Points : 2 278
    Points
    2 278
    Par défaut
    Citation Envoyé par rnr72 Voir le message
    [...]

    le m_texture::iterator est étonnant, je ne dis pas qu'il est faut mais...

    [...]
    m_texture::iterator est faux, techniquement. Pour récupérer le type-membre iterator de n'importe quel conteneur de la classe container, il faut écrire container::iterator, quoi qu'il advienne. Naturellement, dans le cas présent, on peut aussi écrire auto it = m_texture.begin().
    De retour, plus sportif mais toujours aussi moche.
    _____________
    Pro: Programmation en C/C++ (embarqué ou non)
    Loisir: Programmation en C++11/14/17 avec la STL ou Qt 5

  4. #4
    Membre habitué
    Homme Profil pro
    sans activité
    Inscrit en
    Janvier 2016
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : sans activité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 76
    Points : 136
    Points
    136
    Par défaut
    VivienD, nous sommes d'accord.

    Merci de confirmer ce que je pensais.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    Par défaut
    L'écriture vraiment correcte serait for(const auto& el : m_textures) enfin là vu qu'on cherche une clé dans une map, qui est forcément unique, un find serait encore mieux.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Points : 162
    Points
    162
    Par défaut
    Merci à vous ! ça fonctionne ^^

  7. #7
    Membre émérite
    Avatar de VivienD
    Homme Profil pro
    Développeur logiciel
    Inscrit en
    Octobre 2009
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur logiciel
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 523
    Points : 2 278
    Points
    2 278
    Par défaut
    Citation Envoyé par rnr72 Voir le message
    VivienD, nous sommes d'accord.

    Merci de confirmer ce que je pensais.
    Citation Envoyé par Disixlis Voir le message
    Merci à vous ! ça fonctionne ^^
    Il n'y a pas de quoi.
    De retour, plus sportif mais toujours aussi moche.
    _____________
    Pro: Programmation en C/C++ (embarqué ou non)
    Loisir: Programmation en C++11/14/17 avec la STL ou Qt 5

  8. #8
    Membre actif
    Inscrit en
    Mai 2012
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 65
    Points : 282
    Points
    282
    Par défaut
    Comme l'a mentionné Bousk, il est meilleur de faire un find, plutôt qu'une boucle for, car avec un find t'as une recherche en log(N), tandis qu'avec ton for, ta recherche se fait O(N), sans compter les problèmes de caches dû aux pointeurs dans la map.

    Tu peux écrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //En mettant const std::string &, c'est mieux, on évite les recopie inutile
    void addMobs(const std::string & name, std::vector<std::unique_ptr<Entity>> &v_entity, std::map<std::string,sf::Texture> const &m_texture )
    {
        std::map<std::string,sf::Texture>::const_iterator it = m_texture.find(name);
        //Mieux
        //auto it = m_texture.find(name);
     
        if(it != m_texture.end())
            v_entity.emplace_back(std::make_unique<Entity>(it->second, sf::Vector2f(100, 100);
    }
    Il est meilleur de faire un emplace_back, on évite un déplacement, ton unique_ptr sera construit sur place dans ton vector.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide sur les itérateurs
    Par Baquardie dans le forum C#
    Réponses: 1
    Dernier message: 23/04/2008, 23h04
  2. Comment utiliser les itérateurs de flux ?
    Par CedricMocquillon dans le forum SL & STL
    Réponses: 7
    Dernier message: 10/05/2007, 10h09
  3. [C#]Les Itérateurs en .Net
    Par loverdose dans le forum C#
    Réponses: 4
    Dernier message: 02/05/2007, 15h42
  4. Copies de flots en passant par les itérateurs
    Par Christophe Brun dans le forum C++
    Réponses: 7
    Dernier message: 02/07/2003, 12h41

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