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> | ||