TD4 - Déduction de type et bibliothèque standard
Exercice 1 (Vector and Algorithm)
- Remplir un
std::vector
avec des nombres entiers aléatoires compris entre 0 et 100. - Utiliser les itérateurs et les méthodes
begin
etend
pour afficher les valeurs du vecteur à l'aide d'une bouclefor
. - Chercher si un nombre saisi par l'utilisateur est présent dans le vecteur à l'aide de la fonction
std::find
et afficher un message adapté. - Utiliser la fonction
std::count
pour compter le nombre d'occurrences d'un nombre entier dans le vecteur. Vous pouvez trouver la documentation de la fonctionstd::count
ici. - Utiliser la fonction
std::sort
pour trier le vecteur. - Utiliser la fonction
std::accumulate
pour calculer la somme des éléments du vecteur (par défaut, la fonctionstd::accumulate
utilise l'opérateur+
entre les éléments).
Exercice 2 (String)
Étant donnée une phrase composée de mots séparés par des espaces.
Nous avons utilisé dans le TD précédent une astuce avec les stream C++ qui permet de séparer les mots d'une phrase. L'idée est de coder une autre façon d'arriver au même résultat sans utiliser les stream.
Je vous donne la fonction lambda suivante qui permet de savoir si un caractère est un espace:
auto const is_space = [](char letter){ return letter == ' '; };
Le mot clé auto
ici permet de "stocker" la fonction dans une variable pour la passé en paramètre. En réalité se cache derrière des pointeur de fonction ou le type std::function
qui permet d'avoir une variable qui représente une fonction comme cela.
Cela va permettre d'utiliser les fonctions std::find_if_not
et find_if
(qui retourne des itérateurs) pour rechercher ou non des espaces dans une chaîne de caractère.
- Écrire une fonction (à l'aide des fonctions
std::find
etstd::distance
) qui prendre en paramètre une référence constante sur unestd::string
et qui retourne le nombre de lettres du premier mot de la phrase.
Vous allez avoir besoin de la fonction std::distance
, qui retourne la distance entre deux itérateurs, sous forme d’un nombre entier.
- Écrire une fonction qui permet de découper la phrase en mots et de les stocker dans un
std::vector
destd::string
. Voilà le prototype de la fonction :
std::vector<std::string> split_string(std::string const& str);
Exercice 3 (Palindrome)
- Écrire une fonction qui prend en paramètre une référence constante sur une
std::string
et qui retournetrue
si la chaîne de caractères est un palindrome (qui peut se lire dans les deux sens),false
sinon.
Utiliser la fonctions std::equal
pour comparer les valeurs de deux itérateurs.
Utiliser les fonctions std::begin
, std::end
et std::rbegin
, std::rend
pour obtenir les itérateurs de début et de fin d'une chaîne de caractères et de sa version inversée.
Pour aller plus loin (lambda)
- Écrire une fonction qui prend en paramètre un
std::vector
et retourne la somme du carré de ses éléments. Vous devez utiliser la fonctionstd::accumulate
et une fonction lambda. - Écrire une fonction qui prend en paramètre un
std::vector
et retourne le produit de ses éléments pairs. Vous ne devez pas filtrer les éléments du vecteur, mais utiliser une fonction lambda pour déterminer si un élément est pair ou non et si oui, le prendre en compte dans le produit. Vous devez utiliser la fonctionstd::accumulate
et une fonction lambda.