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:part2 [2022/10/08 16:10] bmonsuez |
in204:tds:sujets:td6:part2 [2022/11/18 10:49] (current) |
||
|---|---|---|---|
| Line 5: | Line 5: | ||
| ===== Question n°1 ===== | ===== Question n°1 ===== | ||
| - | Nous considérons toujours notre code affichant le contenu d'un containeur tel que définit dans la [[in204:tds:sujets:td6:part1|première partie]]. | + | Nous considérons toujours notre code affichant le contenu d'un conteneur tel que défini dans la [[in204:tds:sujets:td6:part1|première partie]]. |
| <code cpp> | <code cpp> | ||
| Line 23: | Line 23: | ||
| </code> | </code> | ||
| - | ===== Question n°1.1 ===== | + | ==== Question n°1.1 ===== |
| - | Déterminer ce qui va caractériser un containeur pouvant être pris comme argument par la fonction précédente ? | + | Déterminer ce qui va caractériser un conteneur pouvant être pris comme argument par la fonction précédente ? |
| <hidden Correction> | <hidden Correction> | ||
| - | En fait, il est attendu que le containeur fournisse deux méthodes : | + | En fait, il est attendu que le conteneur fournisse deux méthodes : |
| * `begin()`: retournant un itérateur marquant le début de la séquence, | * `begin()`: retournant un itérateur marquant le début de la séquence, | ||
| Line 35: | Line 35: | ||
| L'itérateur qui est retourné doit supporter : | L'itérateur qui est retourné doit supporter : | ||
| - | * l'accès en lecture des données stockées dans le containeur, | + | * l'accès en lecture des données stockées dans le conteneur, |
| * le parcours en avant. | * le parcours en avant. | ||
| Line 43: | Line 43: | ||
| - | ===== Question n°1.2 ===== | + | ==== Question n°1.2 ===== |
| - | Implanter un concept qui permet de formaliser les exigences que vous venais de formuler ? | + | Implanter un concept qui permet de formaliser les exigences que vous venez de formuler ? |
| <hidden Correction> | <hidden Correction> | ||
| Line 55: | Line 55: | ||
| { a.end() } -> std::forward_iterator; | { a.end() } -> std::forward_iterator; | ||
| }; | }; | ||
| - | <code> | + | </code> |
| </hidden> | </hidden> | ||
| - | ===== Question n°1.3 ===== | + | ==== Question n°1.3 ===== |
| - | Ajouter les contraintes à l'opérateur `<<` qui a été défini pour un containeur. | + | Ajouter les contraintes à l'opérateur %%<<%% qui a été défini pour un conteineur. |
| <hidden Correction> | <hidden Correction> | ||
| + | <code cpp> | ||
| template<typename containerT, typename charT, typename traits = std::char_traits<charT>> | template<typename containerT, typename charT, typename traits = std::char_traits<charT>> | ||
| requires Browsable<containerT> | requires Browsable<containerT> | ||
| Line 79: | Line 80: | ||
| return aStream; | return aStream; | ||
| } | } | ||
| + | </code> | ||
| </hidden> | </hidden> | ||
| - | ===== Question n°1.4 ===== | + | ==== Question n°1.4 ===== |
| Introduisez une implantation de l'opérateur `<<` qui pour tout type affiche 'NONE'. | Introduisez une implantation de l'opérateur `<<` qui pour tout type affiche 'NONE'. | ||
| <hidden Correction> | <hidden Correction> | ||
| + | <code cpp> | ||
| template<typename T, typename charT, typename traits = std::char_traits<charT>> | template<typename T, typename charT, typename traits = std::char_traits<charT>> | ||
| std::basic_ostream<charT, traits>& operator << (std::basic_ostream<charT, traits>& aStream, const T& aContainer) | std::basic_ostream<charT, traits>& operator << (std::basic_ostream<charT, traits>& aStream, const T& aContainer) | ||
| Line 94: | Line 96: | ||
| return aStream; | return aStream; | ||
| } | } | ||
| + | </code> | ||
| </hidden> | </hidden> | ||
| - | ==== Question n°2 ==== | + | ===== Question n°2 ==== |
| Nous avons deux fonctions pour effectuer un tri, l'algorithme simple de tri que nous avons implanté et l'algorithme ``std::sort`` fourni par la STL. | Nous avons deux fonctions pour effectuer un tri, l'algorithme simple de tri que nous avons implanté et l'algorithme ``std::sort`` fourni par la STL. | ||
| - | Cependant notre algorithme fonctionne pour des itérateurs qui ne supporte par l'accès indexé tandis que l'algorithme ``std::sort`` est un quicksort et nécessite un accès indexé mais qui est plus rapide. | + | Cependant notre algorithme fonctionne pour des itérateurs qui ne supportent pas l'accès indexé tandis que l'algorithme ``std::sort`` est un quicksort et nécessite un accès indexé mais qui est plus rapide. |
| - | Modifier le code de ``std::simple_sort`` pour appeller ``std::sort`` si jamais les itérateurs sont des itérateurs supportant l'accès direct (``std::random_iterator``). | + | Modifier le code de ``std::simple_sort`` pour appeller ``std::sort`` si jamais les itérateurs sont des itérateurs supportant l'accès direct (``std::random_access_iterator``). |
| <hidden Correction> | <hidden Correction> | ||
| + | <code cpp> | ||
| 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::random_access_iterator<iterator> && | + | requires(std::forward_iterator<iterator> && ! std::random_access_iterator<iterator> && std::input_or_output_iterator<iterator>) |
| - | std::input_or_output_iterator<iterator>) | + | |
| { | { | ||
| + | std::cout << "Insertion Sort\n"; | ||
| for(;start != end; start ++) | for(;start != end; start ++) | ||
| { | { | ||
| Line 127: | Line 130: | ||
| requires(std::random_access_iterator<iterator> && std::input_or_output_iterator<iterator>) | requires(std::random_access_iterator<iterator> && std::input_or_output_iterator<iterator>) | ||
| { | { | ||
| + | std::cout << "Quicksort\n"; | ||
| return std::sort(start, end); | return std::sort(start, end); | ||
| } | } | ||
| + | </code> | ||
| + | |||
| + | Et nous exécutons le code suivant : | ||
| + | |||
| + | <code cpp> | ||
| + | { | ||
| + | std::list<int> l = {1, 7, 3, 4, 9, 2, 5}; | ||
| + | std::vector<int> v(l.begin(), l.end()); | ||
| + | simple_sort(l.begin(), l.end()); | ||
| + | std::cout << l << std::endl; | ||
| + | simple_sort(v.begin(), v.end()); | ||
| + | std::cout << v << std::endl; | ||
| + | </code> | ||
| + | |||
| + | qui génèrera la sortie suivante: | ||
| + | <code> | ||
| + | Insertion Sort | ||
| + | {1, 2, 3, 4, 5, 7, 9} | ||
| + | Quicksort | ||
| + | {1, 2, 3, 4, 5, 7, 9} | ||
| + | </code> | ||
| + | |||
| </hidden> | </hidden> | ||