TD 15 C++

Rappels


Exercice 1: Lambda

  1. Implémentez le programme déclaré dans 1.1.h (copié ci-dessous) dans un fichier 1.1.cc. Ne modifiez pas 1.1.h !
    #include <functional>
    #include <string>
    #include <vector>
    
    using std::string;
    using std::vector;
    
    struct Student {
      string name;   // Eg. "John Smith"
      int number;    // Identification number, eg. "12345678"
      double grade;  // Global grade over 20.0, eg. 15.5.
    };
    
    // Sorts students by name, lexicographically: "Aab" before "Ac".
    void SortStudentsByName(vector<Student>* students);
    
    // Sorts students by their identification number modulo M: 0 before 1.
    void SortStudentsByNumberModulo(vector<Student>* students, int M);
    
    // Applies the given function to each student inside the vector.
    void ApplyFunctionToStudents(std::function<void(Student*)> fun,
                                 vector<Student>* students);
    Testez votre code:
    rm 1.tar.gz; wget --no-cache http://fabien.viger.free.fr/cpp/td15/1.tar.gz
    tar xf 1.tar.gz
    make 1.1
    RENDU: 1.1.cc


Exercice 2: Move

  1. Copiez le corrigé du 3.4 du TD7 (3.4.h, 3.4.cc) dans des fichiers 2.1.h, 2.1.cc. N'oubliez pas d'ajuster le #include "3.4.h".

    Ajoutez d'abord une version const de l'operator[] (qui, du coup, renvoie une const&)
    Ajoutez ensuite un operator< qui fait la comparaison lexicographique:
    [1, 2, 3, 4] < [1, 2, 4]
    [] < [0, 0]
    operator<([9, 9, 9], [9, 9, 9]) renvoie false car les arguments sont égaux. Faite tourner le test:
    rm 2.tar.gz; wget --no-cache http://fabien.viger.free.fr/cpp/td15/2.tar.gz
    tar xf 2.tar.gz
    make 2.1
    RENDU: 2.1.h, 2.1.cc

  2. Copiez dans 2.2.h et 2.2.cc et ajoutez un "move" constructor et operator= pour que ça tourne beaucoup plus vite.
    Testez: make 2.2

    RENDU: 2.2.h, 2.2.cc

  3. Implémentez dans un fichier 2.3.h une fonction générique (template<>) Select(...) qui prend en arguments cette fonction modifiera le tableau pour ne garder que les éléments vérifiant le prédicat.
    Vous ne pourrez pas utiliser std::remove_if bien sûr, puisque l'idée est de l'implémenter vous-même.

    Indice important: au lieu de fixer le type du prédicat (vous pourriez par exemple penser à std::function ou std::function), utilisez un type générique (qui sera donc un 2ème argument de votre template<...> après le type des eléments).
    Cela permettra à l'utilisateur de Select(...) de l'utiliser avec des prédicats quelconques, et au passage, de passer mes tests.

    Testez:
    make 2.3
    RENDU: 2.3.h