User Tools

Site Tools


in204:tds:sujets:td6:part2

This is an old revision of the document!


Partie II – Spécialisation par contraintes

TD6

Question n°1

Nous considérons toujours notre code affichant le contenu d'un containeur tel que définit dans la première partie.

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 << "}";
} 

Question n°1.1

Déterminer ce qui va caractériser un containeur pouvant être pris comme argument par la fonction précédente ?

Correction

Correction

En fait, il est attendu que le containeur fournisse deux méthodes :

  • `begin()`: retournant un itérateur marquant le début de la séquence,
  • `end()`: retournant un itérateur marquant le fin de la séquence.

L'itérateur qui est retourné doit supporter :

  • l'accès en lecture des données stockées dans le containeur,
  • le parcours en avant.

Il n'a pas besoin de supporter le multipasse.

Question n°1.2

Implanter un concept qui permet de formaliser les exigences que vous venais de formuler ?

Correction

Correction

<code cpp> template<typename T> concept Browsable = requires (const T& a) {

  { a.begin() } -> std::forward_iterator;
  { a.end() } -> std::forward_iterator;

}; <code>

Question n°1.3

Ajouter les contraintes à l'opérateur `«` qui a été défini pour un containeur.

Correction

Correction

template<typename containerT, typename charT, typename traits = std::char_traits<charT» requires Browsable<containerT> 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 << "}";
  return aStream;

}

Question n°1.4

Introduisez une implantation de l'opérateur `«` qui pour tout type affiche 'NONE'.

Correction

Correction

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::cout << "NONE";
  return aStream;

}

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.

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.

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``).

Correction

Correction

template<typename iterator> void simple_sort(iterator start, iterator end)

  requires(std::forward_iterator<iterator> && ! std::random_access_iterator<iterator> && 
  std::input_or_output_iterator<iterator>)

{

  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);
      }
  }

} template<typename iterator> void simple_sort(iterator start, iterator end)

  requires(std::random_access_iterator<iterator> && std::input_or_output_iterator<iterator>)

{

  return std::sort(start, end);

}

in204/tds/sujets/td6/part2.1665245438.txt.gz · Last modified: 2022/10/08 16:10 by bmonsuez