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

Langage C++ Discussion :

Vecteurs en trois dimensions


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Vecteurs en trois dimensions
    Bonjour à tous, j'ai découvert récemment l'existence (je débute) des tableaux redimensionnables avec des vectors(2d):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::vector<std::vector<int>>test;
    test.push_back(std::vector<int>(5,6));
    Je dis peut-être une ânerie, mais il devrait être possible de créer la même chose pour un tableau en trois dimensions et plus?
    J'ai essayé d'en créer un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector<std::vector<std::vector<int>>>test;
    Mais je ne comprends pas comment lui affecter des valeurs comme avant, toutes mes tentatives sont restées vaines...

    J'aimerais donc comprendre, car cela reste un peu abstrait pour moi
    Merci d'avance.

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Une des possibilités (tableau de taille 5*5*5 contenant que des 6):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::vector<std::vector<std::vector<int>>>test;
    {
      std::vector<std::vector<int>> tmp(5, std::vector<int>(5,6));
      test.resize(5, tmp);
    }
    Clairement hideux...

    À moins de vouloir vraiment des lignes de tailles indépendantes pour chaque cellule des deux premières dimensions, il vaut mieux linéariser le vector.
    Quelque chose comme cette matrice adaptée pour la 3d (index = z*w*h + y*w + x si je ne dit pas de bêtise).
    Ou implémenter le TS array_view.

    Par contre, juste pour être sûr, es-tu conscient que ton premier code crée un tableau de taille 1*5 contenant que des 6 ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Ah, merci, je vais m'en m'en tenir à la première proposition pour l'instant, car le reste comporte des notions que je n'ai pas encore abordées dans mes cours (je garde tout cela dans un coin).
    Sinon, oui, mon tableau ne comporte que des "6", c'est pour tester.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Lorsque je suis dans ce cas, j'utilise des typedef. En effet, les typedef seront des gros raccourcis pour chaque niveau de mon tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::vector<int> Ligne;
    Et ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::vector<Ligne> Tableau;
    Et, pour le troisième niveau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::vector<Tableau> Monde;
    Pour la construction d'un tableau à trois dimensions préinitialisé, c'est totalement possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector < std::vector < std::vector < int > > > > monTableau = std::vector<std::vector<std::vector<int> > > >(5, 
        std::vector<std::vector<int>(5, std::vector<int>(5, 6)));
    Si j'ai écris cette ligne juste, c'est que j'ai de la chance.
    En version typedef, ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Monde(5,Tableau(5,Ligne(5,6)));
    Je trouve que ça reste moche, mais bon, c'est déjà un progrès
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    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
    Quoi qu'il en soit, je te recommande de créer une classe dédiée, sur le principe de la matrice, mais en 3D.
    Et de lire les deux questions de la FAQ à ce sujet, ca t'aidera beaucoup pour la suite.

    1. comment indexer une matrice?
    2. Pourquoi ne pas utiliser [][][]?


    Du coup, tu aurais uniquement une classe proposant un constructeur et des accès en 3D.
    Le fait de passer par un vecteur de vecteurs de vecteurs est un détail technique, qui n'intéresse pas celui qui veut manipuler des objets dans l'espace.
    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

  6. #6
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    S'il s'agit d'initialiser d'emblée toute ta matrice, tu devrais aussi pouvoir utiliser les initializer lists, avec une syntaxe du type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::vector<std::vector<int>> = {
                                                   { 1, 2, 3},
                                                   {4, 5, 6}
                                                 };
    ou bien pour une valeur unique par ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ... = {
             std::vector<int>(3,1),
             std::vector<int>(3,2) 
           };
    C'est une solution élégante.

  7. #7
    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
    Précisons que cette solution n'est valable qu'en C++11, c'est à dire avec l'option qui va bien du compilateur (-std=c++11 pour gcc)
    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. Réponses: 1
    Dernier message: 06/04/2007, 11h38
  2. Vecteur couleur à trois composantes
    Par kromartien dans le forum Traitement d'images
    Réponses: 6
    Dernier message: 28/02/2007, 19h21
  3. Trois dimensions en utilisant C
    Par aliassaf dans le forum C
    Réponses: 3
    Dernier message: 05/10/2006, 13h21
  4. Trois dimension python
    Par Extra-Nitro dans le forum GUI
    Réponses: 2
    Dernier message: 23/06/2006, 20h22
  5. Tableau a trois dimension!!!
    Par krfa1 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/10/2005, 15h52

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