This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
in204:tds:sujets:td4:part2 [2019/10/15 11:35] bmonsuez [Question 2.0] |
in204:tds:sujets:td4:part2 [2022/11/18 10:49] (current) |
||
---|---|---|---|
Line 107: | Line 107: | ||
<hidden Correction Complétion de la classe interval> | <hidden Correction Complétion de la classe interval> | ||
+ | |||
Nous débutons par compléter la classe ''interval''. La classe ''interval'' doit exposer au moins deux méthodes que sont les méthodes : | Nous débutons par compléter la classe ''interval''. La classe ''interval'' doit exposer au moins deux méthodes que sont les méthodes : | ||
Line 207: | Line 208: | ||
\\ | \\ | ||
- | |||
</hidden> | </hidden> | ||
<hidden Correction Complétion de la classe interval_iterator> | <hidden Correction Complétion de la classe interval_iterator> | ||
+ | <nodisp 2> | ||
Pour la classe ''interval_iterator'' nous devons implanter les exigences relatives à un [[https://en.cppreference.com/w/cpp/named_req/ForwardIterator|forward iterator]]. | Pour la classe ''interval_iterator'' nous devons implanter les exigences relatives à un [[https://en.cppreference.com/w/cpp/named_req/ForwardIterator|forward iterator]]. | ||
Line 280: | Line 281: | ||
} | } | ||
</code> \\ \\ Il faut désormais implanter les opérateurs d'incrémentation de l'itérateur (ie. pour passer à la valeur suivante). C'est l'opérateur ''++'' qui a est sélectionné, cependant cet opérateur possède deux syntaxes : (1) ''++it'' qui signifie applique l'opération ''++'' à l'objet ''it'' et retourne une référence à cet objet après que l'opération ''++'' a été effectuée; (2) ''it++'' qui signifie fait une copie de l'objet //copy//, applique l'opération à l'objet ''it'' et retourne l'objet //copy// comme résultat de l'opération. L'opérateur ''operator ++()'' correspond à la première synataxe, l'opérateur ''operator ++(int)'' correspond à la seconde syntaxe. Ce qui se traduit par : <code> | </code> \\ \\ Il faut désormais implanter les opérateurs d'incrémentation de l'itérateur (ie. pour passer à la valeur suivante). C'est l'opérateur ''++'' qui a est sélectionné, cependant cet opérateur possède deux syntaxes : (1) ''++it'' qui signifie applique l'opération ''++'' à l'objet ''it'' et retourne une référence à cet objet après que l'opération ''++'' a été effectuée; (2) ''it++'' qui signifie fait une copie de l'objet //copy//, applique l'opération à l'objet ''it'' et retourne l'objet //copy// comme résultat de l'opération. L'opérateur ''operator ++()'' correspond à la première synataxe, l'opérateur ''operator ++(int)'' correspond à la seconde syntaxe. Ce qui se traduit par : <code> | ||
- | iterator& operator() | + | iterator& operator++() |
{ | { | ||
// Passe à la valeur suivant si nous ne sommes pas | // Passe à la valeur suivant si nous ne sommes pas | ||
// déjà à la fin de l'interval. | // déjà à la fin de l'interval. | ||
- | if(mCurrent < mInterval->maxValue) | + | if(mCurrent <= mInterval->maxValue) |
mCurrent ++; | mCurrent ++; | ||
return *this; | return *this; | ||
} | } | ||
- | iterator operator() | + | iterator operator++(int) |
{ | { | ||
- | iterator it(*this); // Crée une copie de l'itérateur. | + | interval_iterator it(*this); // Crée une copie de l'itérateur. |
++(*this); // Incrément l'itérateur courant en appellant | ++(*this); // Incrément l'itérateur courant en appellant | ||
// l'opérateur iterator& operator() | // l'opérateur iterator& operator() | ||
Line 296: | Line 297: | ||
} | } | ||
</code> \\ Il ne reste plus qu'à implanter les opérateurs relatifs à la comparaison. Deux itérateurs sont égaux s'ils font références à la même valeur située dans le même containeur. Dans ce cas, nous devons avoir les champs ''mCurrent'' et ''mInterval'' qui doivent être égaux. <code cpp> | </code> \\ Il ne reste plus qu'à implanter les opérateurs relatifs à la comparaison. Deux itérateurs sont égaux s'ils font références à la même valeur située dans le même containeur. Dans ce cas, nous devons avoir les champs ''mCurrent'' et ''mInterval'' qui doivent être égaux. <code cpp> | ||
- | bool operator ==(const iterator& anotherIterator) const | + | bool operator ==(const interval_iterator& anotherIterator) const |
{ | { | ||
return mCurrent == anotherIterator.mCurrent && | return mCurrent == anotherIterator.mCurrent && | ||
*mInterval == *anotherIterator.mInterval; | *mInterval == *anotherIterator.mInterval; | ||
} | } | ||
- | bool operator !=(const iterator& anotherIterator) const | + | bool operator !=(const interval_iterator& anotherIterator) const |
{ | { | ||
return mCurrent != anotherIterator.mCurrent || | return mCurrent != anotherIterator.mCurrent || | ||
Line 318: | Line 319: | ||
// l'itérateur courant fait référence au même élément que l'itérateur | // l'itérateur courant fait référence au même élément que l'itérateur | ||
// passé en argument. | // passé en argument. | ||
- | iterator operator=(const interval_iterator& anotherIterator) | + | interval_iterator& operator=(const interval_iterator& anotherIterator) |
{ | { | ||
mCurrent = anotherIterator.mCurrent; | mCurrent = anotherIterator.mCurrent; | ||
mInterval = anotherIterator.mInterval; | mInterval = anotherIterator.mInterval; | ||
+ | return *this; | ||
} | } | ||
// Opération de permutation. | // Opération de permutation. | ||
Line 331: | Line 333: | ||
void swap(interval_iterator& anotherIterator) | void swap(interval_iterator& anotherIterator) | ||
{ | { | ||
- | std::swap(mCurrent, anotherInterator.mCurrent); | + | std::swap(mCurrent, anotherIterator.mCurrent); |
- | std::swpa(mInterval, anotherIterator.mInterval); | + | std::swap(mInterval, anotherIterator.mInterval); |
} | } | ||
</code> \\ Et normalement l'ensemble des éléments ont été définis pour à la classe ''interval_iterator'' pour que ce dernier puisse répondre aux exigences auxquelles un itérateur de type [[https://en.cppreference.com/w/cpp/named_req/ForwardIterator|forward iterator]] doit répondre. | </code> \\ Et normalement l'ensemble des éléments ont été définis pour à la classe ''interval_iterator'' pour que ce dernier puisse répondre aux exigences auxquelles un itérateur de type [[https://en.cppreference.com/w/cpp/named_req/ForwardIterator|forward iterator]] doit répondre. | ||
+ | |||
</hidden> | </hidden> | ||
Line 392: | Line 395: | ||
<hidden Explications> | <hidden Explications> | ||
+ | <nodisp 2> | ||
+ | |||
* La fonction ''print'' prend une séquence d'éléments définie par un itérateur de début ''beginIt'' et un itérateur marquant la fin de la séquence ''endIt'' et affiche cette séquence sur la console. La seule particularité, c'est qu'en fonction de la position de l'élément, le séparateur "," est placé entre les valeurs ou non. | * La fonction ''print'' prend une séquence d'éléments définie par un itérateur de début ''beginIt'' et un itérateur marquant la fin de la séquence ''endIt'' et affiche cette séquence sur la console. La seule particularité, c'est qu'en fonction de la position de l'élément, le séparateur "," est placé entre les valeurs ou non. | ||
Line 409: | Line 414: | ||
</code> | </code> | ||
+ | </nodisp> | ||
</hidden> | </hidden> | ||