User Tools

Site Tools


in204:tds:sujets:td6:part1

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
in204:tds:sujets:td6:part1 [2022/10/08 13:44]
bmonsuez created
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 ++)
     {     {
-        ​for(auto it = start + 1; it != end; it ++)+        auto it = start; it++; 
 +        for(;it != end; it ++)
         {         {
             // Compare si les deux elements sont dans le bon ordre.             // Compare si les deux elements sont dans le bon ordre.
             if (*start > *it)             if (*start > *it)
-                std::​swap(*start,​ *it)+                std::​swap(*start,​ *it);
         }         }
     }     }
Line 35: 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 48: Line 48:
  
 </​hidden>​ </​hidden>​
 +
  
 ==== 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>​
  
 +
 +==== Question n°1.3 ====
 +
 +Nous souhaitons ajouter l'​opérateur suivant qui liste l'​ensemble des éléments d'un conteneur:
 +
 +<code cpp>
 +template<​typename ​ containerT, typename charT, typename traits = std::​char_traits<​charT>>​
 +std::​basic_ostream<​charT,​ traits>&​ operator << (std::​basic_ostream<​charT,​ traits>&​ aStream, const containerT&​ aContainer)
 +{
 +    aStream << "​{";​
 +    auto end = aContainer.end();​
 +    for(auto it = aContainer.begin();​ it != end;)
 +    {
 +        aStream << *it ++;
 +        if(it != end)
 +            aStream << ", ";
 +    }
 +    aStream << "​}";​
 +
 +</​code>​
 +
 +Ajouter ce code à votre fichier '​simple_sort.hpp'​ et puis tester ensuite à la fois la précédente fonction et cette nouvelle fonction avec le code suivant :
 +
 +<code cpp>
 +
 +#​include<​list>​
 +#​include"​simple_sort.hpp"​
 +
 +int main() ​
 +{
 +    std::​list<​int>​ v = {1, 7, 3, 4, 9, 2, 5};
 +    simple_sort(v.begin(),​ v.end());
 +    std::cout << v;
 +    return 0;
 +}
 +</​code>​
 +
 +
 +==== Question n°1.4 ====
 +
 +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"​sort.hpp"​
 +
 +struct Toto {};
 +int main() ​
 +{
 +    std::​list<​int>​ v = {1, 7, 3, 4, 9, 2, 5};
 +    simple_sort(v.begin(),​ v.end());
 +    std::cout << v;
 +    std::cout << Toto() << std::endl;
 +    return 0;
 +}
 +</​code>​
 +
 +Expliquer pourquoi le compilateur génére une erreur ?
 +
 +<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 :  ​
 +
 +<code cpp>
 +template<​typename ​ containerT, typename charT, typename traits = std::​char_traits<​charT>>​
 +std::​basic_ostream<​charT,​ traits>&​ operator << (std::​basic_ostream<​charT,​ traits>&​ aStream, const containerT&​ aContainer) {...}
 +</​code>​
 +
 +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>​
 +
 +
 +[[in204:​tds:​sujets:​td6:​part2|Partie 2]]
  
  
in204/tds/sujets/td6/part1.1665236656.txt.gz · Last modified: 2022/10/08 13:44 by bmonsuez