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 2D de shared pointer


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Homme Profil pro
    Ing�nieur Business Intelligence
    Inscrit en
    Juin 2011
    Messages
    108
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur Business Intelligence

    Informations forums :
    Inscription : Juin 2011
    Messages : 108
    Par d�faut Vector 2D de shared pointer
    Bonjour tout le monde, je suis en train de g�rer ma map gr�ce � une classe Carte.

    J'utilise ce code

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    vector < vector < CaseCarte > > m_CaseCarte;
    afin de g�rer chaque case. Malheureusement, quand on utilise une vector, une copie de l'objet est cr�ee en m�moire. Je vais faire court, avec une carte de 10 * 10 cases, sachant que je map sous trois couches (trois sprites par cases), 300 sf::sprite sont utilis�s... �a fait beaucoup.

    Je n'ai pas de ralentissement, la map charge et s'affiche en moins d'une demie seconde.
    J'aimerai faire de l'�conomie de m�moire et manipuler les cases avec ce code :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    vector < vector < shared_ptr <CaseCarte> >> m_CaseCarte;
    Mais comment faire pour initialiser correctement chaque pointeur dans le vector � deux dimensions ?

    Merci D'Avance.
    Au Revoir.

  2. #2
    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,

    Et, si, au lieu de g�rer un tableau � deux dimensions de 10*10 �l�ments, tu g�rais un tableau � une seule dimension de... 100 �l�ments

    La "formule" pour savoir quel �l�ment se trouve o� serait de l'ordre de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    position = (ligne_recherchée * nombre_de_lignes ) + colone_recherchée
    Cela t'�viterait d'avoir des copies de vecteur, et te simplifierait la t�che

    Tu en arriverait donc � quelque chose de fort proche de
    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
    class Map
    {
        public:
            shared_ptr <CaseCarte> * element(int line, int column)
            {
                return items_[line * 10 + column];
            }
            void read(std::string const & filename)
            {
                std::ifstream ifs(filename.c_str());
                for(int line = 0; line <10; ++line)
               {
                   for(int column = 0;column < 10; ++column)
                   {
                       // lecture des sprites et insertion dans items_
                   }
               }
            }
        private:
            std::vector<shared_ptr <CaseCarte> > items_;
    };
    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. #3
    Membre chevronn�

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par d�faut
    Salut,

    Citation Envoy� par Happpy Voir le message
    Malheureusement, quand on utilise une vector, une copie de l'objet est cr�ee en m�moire.
    Si par "utiliser un vector" tu veux dire le donner comme argument � une fonction, alors pour �viter la copie de l'objet, tu peux le transmettre par r�f�rence :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    void MaFonction ( const vector < vector < CaseCarte > >& MaCaseCarte )


    Sinon,
    Citation Envoy� par koala01 Voir le message
    Et, si, au lieu de g�rer un tableau � deux dimensions de 10*10 �l�ments, tu g�rais un tableau � une seule dimension de... 100 �l�ments
    Ce conseil est tr�s pertinent, suis le. J'ai �t� confront� � un probl�me d'extr�me lenteur pour les m�me raison ( si le sujet t'int�resse voici l'adresse du post dans le forum ), la solution �tait d'utiliser un vector � une dimension plut�t qu'un vector de vector

  4. #4
    Membre confirm�
    Homme Profil pro
    Ing�nieur Business Intelligence
    Inscrit en
    Juin 2011
    Messages
    108
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur Business Intelligence

    Informations forums :
    Inscription : Juin 2011
    Messages : 108
    Par d�faut
    Abon, donc en utilisant un vector de vector, on perd obligatoirement en rapidit� ?

  5. #5
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    On gagne en souplesse (souvent malvenue dans ce genre de situation : On peut avoir des tailles diff�rentes sur chaque ligne), mais on perd g�n�ralement en rapidit�.

    A part si la taille est tr�s importante, et qu'allouer tout d'un bloc pourrait poser des probl�mes, j'utiliserais syst�matiquement un seul vecteur.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  6. #6
    Membre confirm�
    Homme Profil pro
    Ing�nieur Business Intelligence
    Inscrit en
    Juin 2011
    Messages
    108
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur Business Intelligence

    Informations forums :
    Inscription : Juin 2011
    Messages : 108
    Par d�faut
    Ah ok d'accord. Oui.

    C'est vrai qu'avec un vector � 1 dimensions, je pourrais facilement utiliser les pointeurs classique (en n'oubliant pas les delete dans le destructeur) et le seul vector sera plus facilement manipulable.

    Je vous tiens au courant pour la transposition 2D - 1D.

  7. #7
    Membre averti
    Profil pro
    �tudiant
    Inscrit en
    Mai 2010
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 25
    Par d�faut
    Sinon, il y a aussi boost::multi_array (http://www.boost.org/doc/libs/1_47_0.../doc/user.html) qui semble adapt� � ce genre de situation.

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Citation Envoy� par Happpy Voir le message
    Ah ok d'accord. Oui.

    C'est vrai qu'avec un vector � 1 dimensions, je pourrais facilement utiliser les pointeurs classique (en n'oubliant pas les delete dans le destructeur) et le seul vector sera plus facilement manipulable.

    Je vous tiens au courant pour la transposition 2D - 1D.
    Je vois pas trop en quoi �a change quelque chose. Dans les deux cas, tu peux prendre des pointeurs classiques ou des sahred_ptr, selon ton besoin.

Discussions similaires

  1. R�ponses: 25
    Dernier message: 19/05/2010, 09h03
  2. vector bidimensionnel et pointer ?
    Par devroot dans le forum SL & STL
    R�ponses: 8
    Dernier message: 17/01/2008, 21h58
  3. templates et smart pointers
    Par delire8 dans le forum C++
    R�ponses: 9
    Dernier message: 10/07/2003, 16h26
  4. R�ponses: 5
    Dernier message: 05/07/2003, 11h52
  5. [Pointer]Treeview.Data
    Par rbag dans le forum Composants VCL
    R�ponses: 7
    Dernier message: 31/08/2002, 01h44

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