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?
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?
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.
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.
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)
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.
Merci pour toutes ces informations; je vais étudier tout ça ce week-end.
![]()
A noter que le chapitre sur les allocateur du livre de Josuttis est en libre consultation.
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; }J'accede a chaque elements de mon tableau A[] grace a B[][][] sans recopier la zone memoire
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
(clavier en qwerty, desole pour les accents )
Partager