OVH Cloud OVH Cloud

Tableau 3D d'un objet

4 réponses
Avatar
Carine Modolo
Bonjour,

Je cherche à créer un tableau 3 dimensions
de pointeurs sur un objet :
Objet *tab[][][]

pour lequel les dimensions sont dynamiques
Objet *tab[][][] = new Objet *[i][j][k] ???
(Meme en statique je n'y arrive pas)
Objet *tab[][][] = new Objet *[2][3][5] ???

Quelqu'un peut-il m'aider?

Merci

4 réponses

Avatar
Vincent Lascaux
Je cherche à créer un tableau 3 dimensions
de pointeurs sur un objet :
Objet *tab[][][]


std::vector< std::vector< std::vector< Objet *> > > tab;

pour lequel les dimensions sont dynamiques
Objet *tab[][][] = new Objet *[i][j][k] ???


tab.resize(i, std::vector< std::vector< Objet* > >(j,
std::vector<Objet*>(k)));

--
Vincent

Avatar
kanze
Carine Modolo wrote in message
news:...

Je cherche à créer un tableau 3 dimensions de pointeurs sur un objet :
Objet *tab[][][]

pour lequel les dimensions sont dynamiques
Objet *tab[][][] = new Objet *[i][j][k] ???
(Meme en statique je n'y arrive pas)
Objet *tab[][][] = new Objet *[2][3][5] ???

Quelqu'un peut-il m'aider?


std::vector< std::vector< std::vector< Objet* > > >
tab( i, std::Vector< std::vector< Object* > >( j, k ) ;

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16

Avatar
Vincent Lascaux
std::vector< std::vector< std::vector< Objet* > > >
tab( i, std::Vector< std::vector< Object* > >( j, k ) ;


Quel est le constructeur appelé dans l'expression std::Vector< std::vector<
Object* > >( j, k ) ? Dans la MSDN, j'ai trouvé cette liste des
constructeurs :

vector( );
explicit vector(const Allocator& _Al);
explicit vector(size_type _Count);
vector(size_type _Count, const Type& _Val);
vector(size_type _Count, const Type& _Val, const Allocator& _Al);
vector(const _vector& _Right);
template<class InputIterator>
vector(InputIterator _First, InputIterator _Last);
template<class InputIterator>
vector(InputIterator _First, InputIterator _Last, const Allocator& _Al);

Les deux seuls constructeurs à deux parametres sont :
- celui qui prend la taille et un const Type& (mais k n'est pas un
std::vector<Objet*> car le constructeur est explicit)
- celui qui prend des iterateurs. Celui là pourrait etre appelé sur des
entiers, mais je ne pense pas que ca compile (parceque l'operateur * unaire
sur un entier n'est pas définit).

--
Vincent

Avatar
kanze
"Vincent Lascaux" wrote in message
news:<3fcb84b5$0$2785$...

std::vector< std::vector< std::vector< Objet* > > >
tab( i, std::Vector< std::vector< Object* > >( j, k ) ;


Quel est le constructeur appelé dans l'expression std::Vector< std::vector<
Object* > >( j, k ) ? Dans la MSDN, j'ai trouvé cette liste des
constructeurs :

vector( );
explicit vector(const Allocator& _Al);
explicit vector(size_type _Count);
vector(size_type _Count, const Type& _Val);
vector(size_type _Count, const Type& _Val, const Allocator& _Al);
vector(const _vector& _Right);
template<class InputIterator>
vector(InputIterator _First, InputIterator _Last);
template<class InputIterator>
vector(InputIterator _First, InputIterator _Last, const Allocator& _Al);

Les deux seuls constructeurs à deux parametres sont :
- celui qui prend la taille et un const Type& (mais k n'est pas un
std::vector<Objet*> car le constructeur est explicit)
- celui qui prend des iterateurs. Celui là pourrait etre appelé sur
des entiers, mais je ne pense pas que ca compile (parceque l'operateur
* unaire sur un entier n'est pas définit).


C'est bien celui qui prend les « itérateurs ». Pour citer la norme
(§23.1.1/9) :

For every sequence defined in this clause [std::vector est une
séquence définie dans §23] and in clause 21:

-- the constructor

template< class InputIterator >
X(InputIterator f, InputIterator l, const Allocator& a = Allocator&())

shall have the same effect as:

X(static_cast<typename X::size_type>(f),
static_cast<typename X::value_type>(l),
a)

if InputIterator is an integral type.

Essaie avec ton compilateur, mais la norme dit que ça doit marcher.

On pourrait arguer que
std::vector< std::vector< Object* > >( j, std::vector< Object* >( k ) )
serait plus clair. Peut-être. Franchement, je trouve que quand il s'agit
des tableaux multi-dimensionnels, std::vector n'est pas clair, quelque
soit la façon qu'on l'écrit. Je ne connais pas valarray, c'est peut-être
la bonne solution, mais sinon, je commencerais par écrire une classe à
moi, qui mappe un vector d'une dimension en trois dimensions.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16