Exercice 153 (90 revisité)
Ancien énoncé
Définir une classe vect permettant de représenter des « vecteurs dynamiques », c’està-dire dont la dimension peut ne pas être connue lors de la compilation. Plus
précisément, on prévoira de déclarer de tels vecteurs par une instruction de la
forme :
vect t(exp) ;
dans laquelle exp désigne une expression quelconque (de type entier).
On définira, de façon appropriée, l’opérateur [] de manière qu’il permette d’accéder
à des éléments d’un objet d’un type vect comme on le ferait avec un tableau
classique.
On ne cherchera pas à résoudre les problèmes posés éventuellement par l’affectation
ou la transmission par valeur d’objets de type vect. En revanche, on s’arrangera pour
qu’aucun risque de « débordement » d’indice n’existe.
Commentaires
La classe vector fait l’affaire, y compris pour l’affectation ou la transmission par
valeur. Elle dispose d’un itérateur à accès direct (nommé toujours iterator). Mais, de
plus, l’opérateur [] y est surdéfini de sorte qu’il fournit une écriture plus concise pour
l’accès direct à un élément. Si v est un objet de type vector, la notation v[i] est
équivalente à *(v.begin()+i).
Toutefois, cet opérateur [] n’est pas protégé contre les débordements d’indice. On peut
résoudre le problème en utilisant, à sa place, la fonction membre at qui déclenche une
exception standard out_of_range en cas de débordement d’indice. Si l’on veut absolument
se tenir à l’interface imposée par l’énoncé, on peut également créer artificiellement une
classe vect dérivée de vector, dans laquelle on définit l’opérateur [] de façon
appropriée. Cette dernière démarche a le mérite d’offrir toute latitude quant au
traitement à mettre en œuvre en cas de débordement : déclenchement d’une exception,
modification autoritaire de la valeur de l’indice comme on l’a fait dans la solution de
l’exercice 39, etc.
Voici un premier exemple où l’on se contente d’utiliser la classe vector et son
379
Ancien énoncé
Définir une classe vect permettant de représenter des « vecteurs dynamiques », c’està-dire dont la dimension peut ne pas être connue lors de la compilation. Plus
précisément, on prévoira de déclarer de tels vecteurs par une instruction de la
forme :
vect t(exp) ;
dans laquelle exp désigne une expression quelconque (de type entier).
On définira, de façon appropriée, l’opérateur [] de manière qu’il permette d’accéder
à des éléments d’un objet d’un type vect comme on le ferait avec un tableau
classique.
On ne cherchera pas à résoudre les problèmes posés éventuellement par l’affectation
ou la transmission par valeur d’objets de type vect. En revanche, on s’arrangera pour
qu’aucun risque de « débordement » d’indice n’existe.
Commentaires
La classe vector
valeur. Elle dispose d’un itérateur à accès direct (nommé toujours iterator). Mais, de
plus, l’opérateur [] y est surdéfini de sorte qu’il fournit une écriture plus concise pour
l’accès direct à un élément. Si v est un objet de type vector
équivalente à *(v.begin()+i).
Toutefois, cet opérateur [] n’est pas protégé contre les débordements d’indice. On peut
résoudre le problème en utilisant, à sa place, la fonction membre at qui déclenche une
exception standard out_of_range en cas de débordement d’indice. Si l’on veut absolument
se tenir à l’interface imposée par l’énoncé, on peut également créer artificiellement une
classe vect dérivée de vector
appropriée. Cette dernière démarche a le mérite d’offrir toute latitude quant au
traitement à mettre en œuvre en cas de débordement : déclenchement d’une exception,
modification autoritaire de la valeur de l’indice comme on l’a fait dans la solution de
l’exercice 39, etc.
Voici un premier exemple où l’on se contente d’utiliser la classe vector
379
