Bonjours,
Je veux écrir une classe de matrice et surcharge operateur [][].
Est-ce que vous pouvez me dire comment faire?
Merci d'avance
Bonjours,
Je veux écrir une classe de matrice et surcharge operateur [][].
Est-ce que vous pouvez me dire comment faire?
Merci d'avance
Tu peux pas, ça existe pas. Tu peux juste faire en sorte de chainer les appels à [] en passant par un autre objet qui aurait aussi [] surcharger.
Mais c'est pas la bonne façon de faire...
Et pourquoi c'est pas une bonne idée :
http://www.parashift.com/c++-faq-lit...html#faq-13.11
Pour être plus précis, le chaînage d'opérateurs [] n'est réellement valable que dans deux cas, à ma connaissance :
- Ta "matrice" n'est pas une vraie matrice, et les diverses lignes (ou colonnes suivant le point de vue) n'ont pas la même taille entre elles... Ou, pire, tu n'as pas forcément le même nombre de dimensions suivant les coordonnées.
En fait, tu as plus une structure arborescente que matricielle dans ce cas, et le chaînage est alors plus efficace et plus facile à implémenter, et il permet d'extraire plus facilement des "blocs" (= des branches) de ta structure globale.- Ta matrice est le reflet exact d'une mémoire très bas niveau que tu encapsules dans une classe par souci de simplification / abstraction.
L'argument "l'organisation peut changer" est alors très souvent caduque, et il peut être préférable d'avoir une organisation par chaînage. De plus, tu as souvent besoin dans un tel cas d'un accès particulier (ex : mode "raster" pour des mémoires vidéo), et la possibilité d'obtenir facilement un accès "ligne à ligne" plutôt que "case par case" est parfois préférable.
Toutefois, comme très souvent lorsque l'on parle d'optimisations bas niveau, il vaut mieux avoir l'expérience de ce genre de choses pour savoir si l'on n'est pas en train de mettre des choses "en dur" là où il n'en faudrait pas.
Dans tous les cas, y compris les deux cas précités, le fait que l'on chaîne les opérateurs [] pour des raisons de performances / simplicité d'extraction ne veut pas dire qu'un opérateur () en plus des opérateurs [] est nuisible, au contraire...![]()
Mac LAK.
___________________________________________________
Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.
Sources et composants Delphi sur mon site, L'antre du Lak.
Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.
Rejoignez-nous sur : ► Serveur de fichiers [NAS] ► Le Tableau de bord projets ► Le groupe de travail ICMO
Un autre cas où cela peut apparaitre est quand les lignes de la matrice sont l'objet qu'on manipule usuellement, mais dont on a parfois besoin de lire un élément.
La matrice est alors une concaténation de vecteurs de taille fixe, que l'on manipule avec des algorithmes purement vectoriels, mais le second opérateur [] est alors fourni pour l'accès à un élément unique.
Dans le cas des "matrices comme à l'école", le principal défaut de la notation [][] (que l'on peut rendre efficace si par exemple le premier opérateur crochet renvoie un pointeur) est qu'il brise la symétrie ligne colonne qu'on rencontre souvent dans les opérations matricielles... Si les i représentent les lignes et les j les colonnes, on peut écrire A[i][j], A[i], mais pas A[j]...
Francois
Si c'est même exactement l'idée. Sur ta classe Matrice, tu surcharges l'opérateur [] pour qu'il te renvoie des lignes (en général, on s'attend à ce que le premier indice soit la ligne), donc soit des vecteurs, soit des pointeurs.
Dans ce cas, le second opérateur [] existe déjà, tu n'as pas même besoin de le surcharger.
Après, tu as plusieurs implémentations possibles.
Tu peux définir ta matrice comme un tableau de lignes. En STL, un vector< vector<double> >. Avec cela, tu n'as même pas besoin de surcharger quoi que ce soit. Le défaut de cette approche est qu'elle n'est pas très efficace (en terme de vitesse, et d'utilisation de la mémoire). Cependant, pour de petites matrices, en pas trop grand nombre, elle est souvent largement suffisante, et la STL gère à ta place les opérateurs, l'allocation et tout le cirque.
Une autre approche consiste à stocker toute la matrice comme un tableau unique (un vecteur ayant nb_lignes x nb_colonnes éléments), à placer des "pointeurs ligne" tous les nb_colonnes éléments. Puis, à surcharger les [] de façon à faire ce qu'il te faut. L'avantage est que c'est un peu plus léger et rapide.
Ensuite, si tu as des besoins plus sérieux, il y a pas mal de librairies de matrices. Là, le choix dépend de ce que tu vas utiliser :
- beaucoup de petites matrices ou peu de grosses matrices
- des matrices pleines ou creuses
- de l'arithmétique de base ou des calculs plus complexes
Francois
Partager