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

Boost C++ Discussion :

array to "3D vector"


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 8
    Par défaut array to "3D vector"
    Hello!
    Je n'arrive pas à assigner un tableau classique à un vector de vector de vector (un vector 3D en clair) sans copier la zone mémoire.
    C'est possible docteur?

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 8
    Par défaut
    Bon, je viens de voir que les vectors ne sont pas adaptes pour faire des tableaux 3D performants.
    Il faut utiliser boost ou une autre librairie.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Ou te faire tes classes. C'est faisable.

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    Par défaut
    Si tu optes pour tes propres classes, va lire les articles de notre très chère faq:
    indexer une matrice
    matrice != [][]

    Cela t'évitera une aberration de conception malheureusement fréquente.

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Citation Envoyé par Slaab Voir le message
    Hello!
    Je n'arrive pas à assigner un tableau classique à un vector de vector de vector (un vector 3D en clair) sans copier la zone mémoire.
    C'est possible docteur?
    Citation Envoyé par Slaab Voir le message
    Bon, je viens de voir que les vectors ne sont pas adaptes pour faire des tableaux 3D performants.
    Il faut utiliser boost ou une autre librairie.
    Bonjour et bienvenue sur le forum

    La copie ne sera faite que si tu le demandes ou si c'est indispensable (si tu fais un resize de taille supérieure). Dans ce cas, il faut réserver une taille suffisante dès le départ. Sinon je crois pas que ce soit un problème d'utiliser vector (tout au moins, tu auras le même problème avec n'importe quel conteneur)

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    J'avais déjà posé la question sur ce forum, et je crois que par défaut std::vector fait systématiquement une recopie de la zone mémoire qu'on lui fournit. Par contre, il est possible de modifier ce comportement en fournissant un std::allocator qui n'est pas celui par défaut. C'est ce qui est fait dans Boost.Interprocess.

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 8
    Par défaut
    Merci pour toutes ces informations; je vais étudier tout ça ce week-end.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    A noter que le chapitre sur les allocateur du livre de Josuttis est en libre consultation.

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 8
    Par défaut
    J'ai choisi boost pour mon probleme (on sort de la STL). Voici une solution pour les interesses :
    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
    #include<iostream>
    #include "boost/multi_array.hpp"
     
    int main(void)
    {
       const int dim1=2;
       const int dim2=3;
       const int dim3=4;
       float A[dim1*dim2*dim3];
       for(int i=0;i<dim1*dim2*dim3;++i) A[i]=i;
     
       boost::multi_array_ref<float, 3> B(A, boost::extents[dim1][dim2][dim3]);
     
       for (int i=0;i<dim1;++i)
       {
          for (int j=0;j<dim2;++j)
          {
             for (int k=0;k<dim3;++k)
             {
                int index = i*dim2*dim3+j*dim3+k;
                std::cout<<A[index]<<" "<<A+index<<" <---> "<<B[i][j][k]<<" "<<&B[i][j][k]<<std::endl;
             }
          }
       }
       return 0;
    }
    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
    $ g++ main.cpp && ./a.out 
    0 0x7fff8de71710 <---> 0 0x7fff8de71710
    1 0x7fff8de71714 <---> 1 0x7fff8de71714
    2 0x7fff8de71718 <---> 2 0x7fff8de71718
    3 0x7fff8de7171c <---> 3 0x7fff8de7171c
    4 0x7fff8de71720 <---> 4 0x7fff8de71720
    5 0x7fff8de71724 <---> 5 0x7fff8de71724
    6 0x7fff8de71728 <---> 6 0x7fff8de71728
    7 0x7fff8de7172c <---> 7 0x7fff8de7172c
    8 0x7fff8de71730 <---> 8 0x7fff8de71730
    9 0x7fff8de71734 <---> 9 0x7fff8de71734
    10 0x7fff8de71738 <---> 10 0x7fff8de71738
    11 0x7fff8de7173c <---> 11 0x7fff8de7173c
    12 0x7fff8de71740 <---> 12 0x7fff8de71740
    13 0x7fff8de71744 <---> 13 0x7fff8de71744
    14 0x7fff8de71748 <---> 14 0x7fff8de71748
    15 0x7fff8de7174c <---> 15 0x7fff8de7174c
    16 0x7fff8de71750 <---> 16 0x7fff8de71750
    17 0x7fff8de71754 <---> 17 0x7fff8de71754
    18 0x7fff8de71758 <---> 18 0x7fff8de71758
    19 0x7fff8de7175c <---> 19 0x7fff8de7175c
    20 0x7fff8de71760 <---> 20 0x7fff8de71760
    21 0x7fff8de71764 <---> 21 0x7fff8de71764
    22 0x7fff8de71768 <---> 22 0x7fff8de71768
    23 0x7fff8de7176c <---> 23 0x7fff8de7176c
    J'accede a chaque elements de mon tableau A[] grace a B[][][] sans recopier la zone memoire
    (clavier en qwerty, desole pour les accents )

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

Discussions similaires

  1. Quote et double quote
    Par aktos dans le forum Langage
    Réponses: 8
    Dernier message: 05/01/2007, 19h55

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