Là aussi, tu aborde finalement deux problèmes particuliers...
Celui de l'imbrication "brute" des vecteurs, et celui de la délégation des tâches.
Je ne suis absolument pas partisan de trouver un code proche demais, la délégation des tâche aidant, je ne suis pas forcément opposé au fait de retrouver un code proche de
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 typedef std::vector<std::vector<UnType> > Matrix; /*...*/
ou la version utilisant boost::array si les dimensions sont clairements définies à la base.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 class Line { private: std::vector<UnType> l; }; class Matrix { private: std::vector<Line> m; };
Et je n'aurais même aucune objection, si seuls le type réellement manipulé et la matrice étaient intéressant à avoir des classes imbriquées, sous la forme de
Parce que cela implique que j'aie au minimum réfléchi correctement à la sémantique à apporter aux différentes dimensions.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 class Matrix { class Line { private: std::vector<UnType> l; }; public: /* interface */ private: std::vector<Line> m; };
Et cette réflexion m'inciterait peut-être à choisir justement un conteneur différents, selon le type le plus courent d'accès envisagé
Ceci dit, si cette approche souffre effectivement des problèmes liés au redimensionnement et à la copie des tableaux dynamiques, qui sont, finalement, les mêmes que ceux rencontrés pour les tableaux C style, elle permet de travailler de manière beaucoup plus "exception safe" du fait du RAII.
Au passage, la nouvelle norme en préparation (connue sous le vocable C++0x et prévue normalement pour la fin de l'année) prévoit d'introduire la notion de "sémantique de mouvement" (move semantic) qui permettra justement d'éviter au maximum les copies inutiles d'objets.
Partager