This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
in204:tds:sujets:td6:part1 [2022/10/08 15:26] bmonsuez |
in204:tds:sujets:td6:part1 [2022/11/18 10:49] (current) |
||
---|---|---|---|
Line 6: | Line 6: | ||
===== Question n°1===== | ===== Question n°1===== | ||
- | Créer un projet dans lequel vous définissez intégrer le fichier "simple_sort.hpp" qui contient la fonction de comparaison suivante: | + | Créer un projet dans lequel vous intégrez le fichier "simple_sort.hpp" qui contient la fonction de comparaison suivante: |
<code cpp> | <code cpp> | ||
Line 13: | Line 13: | ||
template<typename iterator> | template<typename iterator> | ||
- | void simple_sort(iterator start, iterator end) | + | void simple_sort(iterator start, iterator end) |
- | requires(std::forward_iterator<iterator> && std::input_or_output_iterator<iterator>) | + | |
{ | { | ||
for(;start != end; start ++) | for(;start != end; start ++) | ||
Line 36: | Line 35: | ||
<hidden Correction> | <hidden Correction> | ||
Il s'agit d'un itérateur: | Il s'agit d'un itérateur: | ||
- | | + | |
* devant offrir une itération croissante, | * devant offrir une itération croissante, | ||
- | * devant offrir la possibilité de reprendre l'itération à partir d'une position antérieurement stocké. | + | * devant offrir la possibilité de reprendre l'itération à partir d'une position antérieurement stockée. |
Si nous regardons les caractéristiques des itérateurs: [[https://en.cppreference.com/w/cpp/iterator|Iterator library]], nous constatons que: | Si nous regardons les caractéristiques des itérateurs: [[https://en.cppreference.com/w/cpp/iterator|Iterator library]], nous constatons que: | ||
Line 53: | Line 52: | ||
==== Question n°1.2 ===== | ==== Question n°1.2 ===== | ||
- | Ajouter une contrainte imposant que le type passé à la fonction correspond bien au type d'itérateur que vous avez identifié ? | + | Ajouter une contrainte imposant que le type passé à la fonction correspond bien au type d'itérateur que vous avez identifié. |
<hidden Correction> | <hidden Correction> | ||
+ | <code cpp> | ||
+ | template<typename iterator> | ||
+ | void simple_sort(iterator start, iterator end) | ||
+ | requires(std::forward_iterator<iterator> && std::input_or_output_iterator<iterator>) | ||
+ | { | ||
+ | std::cout << "Insertion Sort\n"; | ||
+ | for(;start != end; start ++) | ||
+ | { | ||
+ | auto it = start; it++; | ||
+ | for(;it != end; it ++) | ||
+ | { | ||
+ | // Compare si les deux elements sont dans le bon ordre. | ||
+ | if (*start > *it) | ||
+ | std::swap(*start, *it); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
</hidden> | </hidden> | ||
Line 61: | Line 78: | ||
==== Question n°1.3 ==== | ==== Question n°1.3 ==== | ||
- | Nous supposons ajouter l'opérateur suivant qui liste l'ensemble des éléments d'un containeur: | + | Nous souhaitons ajouter l'opérateur suivant qui liste l'ensemble des éléments d'un conteneur: |
<code cpp> | <code cpp> | ||
Line 98: | Line 115: | ||
==== Question n°1.4 ==== | ==== Question n°1.4 ==== | ||
- | Dans la question précédente, nous avons définit une nouvelle surcharge de l'opérateur <<. En fait, cette surcharge n'est pas optimale, puisqu'il suffit que je définisse un type quelconque non supporté et cela ne fonctionne plus : | + | Dans la question précédente, nous avons défini une nouvelle surcharge de l'opérateur %%<<%%. En fait, cette surcharge n'est pas optimale, puisqu'il suffit que je définisse un type quelconque non supporté et cela ne fonctionne plus : |
+ | <code cpp> | ||
#include<list> | #include<list> | ||
#include"sort.hpp" | #include"sort.hpp" | ||
Line 112: | Line 130: | ||
return 0; | return 0; | ||
} | } | ||
+ | </code> | ||
Expliquer pourquoi le compilateur génére une erreur ? | Expliquer pourquoi le compilateur génére une erreur ? | ||
<hidden Correction> | <hidden Correction> | ||
- | En fait, il n'y a pas de surcharge de l'opérateur `<<` pour le type `Toto`, en conséquence, le compilateur va rechercher dans les opérateurs qui n'ont pas de contraintes sur les types, vous vous souvenez qu'on essaye d'abord les opérateurs les plus généraux et ensuite les moins généraux. Il trouve donc dans l'espace de nom courant l'opérateur : | + | En fait, il n'y a pas de surcharge de l'opérateur %%<<%% pour le type `Toto`, en conséquence, le compilateur va rechercher dans les opérateurs qui n'ont pas de contraintes sur les types, vous vous souvenez qu'on essaye d'abord les opérateurs les plus généraux et ensuite les moins généraux. Il trouve donc dans l'espace de nom courant l'opérateur : |
<code cpp> | <code cpp> | ||
Line 123: | Line 142: | ||
</code> | </code> | ||
- | et ne sait pas que cet opérateur n'est définit que pour les objets qui sont des containers au sens de la STL. En conséquence de quoi, il génère une erreur puisqu'il essaye d'instancier un code qui ne supporte pas des objets de type `Toto`. | + | et ne sait pas que cet opérateur n'est définit que pour les objets qui sont des conteneurs au sens de la STL. En conséquence de quoi, il génère une erreur puisqu'il essaye d'instancier un code qui ne supporte pas des objets de type `Toto`. |
</hidden> | </hidden> |