Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

gestion dynamique des tableaux en 2D

3 réponses
Avatar
Benoit Noyelles
Bonjour.

Je souhaite travailler sur des tableaux en 2D dont la taille n'est pas
connue a priori (concrètement, des matrices).

J'ai commencé à utiliser le type double** mais j'ai l'impression d'avoir
des soucis d'allocation de mémoire. J'ai trouvé ce fil intéressant :

http://milien.com/?prohNhZ86n

qui dit que le risque d'un soucis d'allocation mémoire est présent, et
qui donne 2 solutions : utiliser un tableau à une dimension (double*),
et utiliser le type std::valarray.

Le petit soucis est que ce fil date de 4 ans, donc y'a-t-il des
arguments nouveaux depuis en faveur de l'une ou l'autre méthode? Une
meilleure solution existe-t-elle maintenant?

Merci!

Benoît.

3 réponses

Avatar
Fabien LE LEZ
On 14 Aug 2006 10:29:12 GMT, Benoit Noyelles :

Je souhaite travailler sur des tableaux en 2D dont la taille n'est pas
connue a priori (concrètement, des matrices).



J'ai commencé à utiliser le type double** mais j'ai l'impression d'avoir
des soucis d'allocation de mémoire.


Tu parles...

http://milien.com/?prohNhZ86n


AMHA le lien n'est pas bon, il renvoie vers un truc bizarre.

qui dit que le risque d'un soucis d'allocation mémoire est présent, et
qui donne 2 solutions : utiliser un tableau à une dimension (double*),
et utiliser le type std::valarray.


Uh ?
std::valarray est peut-être adapté ; j'avoue ne l'avoir jamais
utilisé.

Typiquement, pour une matrice, j'utiliserais une encapsulation de
std::vector <std::vector <T> >.

(Ou bien un truc à base de map<pair<int,int>,T> s'il s'agit d'une
matrice très grande et presque vide.)

Le petit soucis est que ce fil date de 4 ans


Le langage n'a guère changé entre-temps.

Avatar
kanze
Fabien LE LEZ wrote:

Typiquement, pour une matrice, j'utiliserais une encapsulation
de std::vector <std::vector <T> >.


Et non std::vector< T >, avec linéarisation des indices dans
l'encapsulation ?

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Fabien LE LEZ
On 16 Aug 2006 05:00:37 -0700, "kanze" :

Typiquement, pour une matrice, j'utiliserais une encapsulation
de std::vector <std::vector <T> >.


Et non std::vector< T >, avec linéarisation des indices dans
l'encapsulation ?


Si la matrice a une taille fixe, peut-être. Ça dépend de ce que je
veux en faire, voire de mon humeur du moment.

Si je dois pouvoir augmenter la largeur en cours de route, sans perdre
les données, je trouve vector<vector<T>> plus facile à utiliser.

En tout cas, ce qui est sûr, c'est qu'il faut séparer la partie
"tableau type STL" et la partie "objet mathématique". On commence par
créer une classe

template <class T> class Tableau2D<T>
{
public:
struct Taille { int largeur; int hauteur; };
struct Position { int x; int y; };

Tableau2D (Taille const&);
void ChangeTaille (Taille const&);
T& Element (Position const&);
Taille GetTaille() const;
//etc.
};

puis :

template <class Scalaire> class Matrice
{
public:
// Différentes fonctions mathématiques : +, -, inverse, etc.
private:
typedef Tableau2D<Scalaire> Data;
Data data;
};