IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

surcharge operateur [][]


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 25
    Par défaut surcharge operateur [][]
    Bonjours,
    Je veux écrir une classe de matrice et surcharge operateur [][].
    Est-ce que vous pouvez me dire comment faire?

    Merci d'avance

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    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

  3. #3
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    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

  4. #4
    Invité
    Invité(e)
    Par défaut
    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

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 25
    Par défaut
    Citation Envoyé par fcharton Voir le message
    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

    En fait j'ai une classe de vecteur où j'ai surchargé le operator[] qui fait...
    Je peux pas faire le même chose avec le matrice?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Hrayr Voir le message
    En fait j'ai une classe de vecteur où j'ai surchargé le operator[] qui fait...
    Je peux pas faire le même chose avec le matrice?
    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

Discussions similaires

  1. surcharge operateur delete et héritage
    Par Hervé dans le forum C++
    Réponses: 5
    Dernier message: 29/03/2006, 13h59
  2. Surcharge operateur =
    Par rulianf dans le forum C++
    Réponses: 9
    Dernier message: 23/02/2006, 00h32
  3. [debutante] surcharge operateur <<
    Par norkius dans le forum Débuter
    Réponses: 3
    Dernier message: 24/10/2005, 12h20
  4. [Surcharge]Operateur<< avec une classe maison
    Par KeNnEdY dans le forum C++
    Réponses: 6
    Dernier message: 14/09/2005, 15h51
  5. surcharge operateur && pointeurs
    Par le y@m's dans le forum C++
    Réponses: 6
    Dernier message: 10/05/2005, 15h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo