• 10 heures
  • Difficile

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 10/02/2022

Utilisez la bibliothèque standard

Découvrez le contenu principal de la SL

Partie n° 1 de la SL : l'héritage du C

L'ensemble de la bibliothèque standard du C est présente dans la SL. Les 15 fichiers d'en-tête du C (norme de 1990) sont disponibles quasiment à l'identique en C++.

Je vous présenterai ces vénérables éléments venus du C à la fin de ce chapitre.

Partie n° 2 de la SL : les flux

On trouve également l'ensemble des outils permettant de faire communiquer les programmes avec l'extérieur. Ce sont les classes permettant :

  • d'afficher des messages dans la console ;

  • d'écrire du texte dans la console ;

  • ou encore d'effectuer des opérations sur les fichiers.

Nous avons déjà appris à utiliser cout  , cin ainsi que les fstream pour communiquer avec des fichiers plus tôt dans ce cours. Je ne vais pas vous en apprendre beaucoup plus dans la suite. Mais nous allons quand même voir quelques fonctionnalités, comme la copie d'un fichier dans un tableau de mots. Vous verrez que certaines opérations fastidieuses peuvent être réalisées de manière très simple, une fois que l'on connaît les bons concepts.

Partie n° 3 : la STL

La Standard Template Library (STL) est certainement la partie la plus intéressante.

On y trouve :

  • des conteneurs comme vector qui permettent de stocker des objets selon différents critères ;

  • quelques algorithmes comme la recherche d'éléments dans un conteneur, ou le tri d'éléments ;

  • des itérateurs ;

  • des foncteurs ;

  • des prédicats ;

  • des pointeurs intelligents ;

  • et plein d'autres choses que nous allons découvrir en détail.

Vous vous en doutez peut-être, la suite de ce cours sera consacrée principalement à la description de la STL.

Le reste

Il y a quelques éléments de la bibliothèque standard qui sont inclassables :

  • en particulier la classe string  , qui est à la frontière entre la STL et les flux ;

  • certains outils concernant la gestion fine de la mémoire ;

  • les paramètres régionaux ;

  • ou encore les nombres complexes…

... ne rentrent dans aucune des trois parties principales. Mais cela ne veut pas dire que je ne vous en parlerai pas.

Documentez-vous sur la SL

La description détaillée de chaque fonctionnalité se trouve dans la norme du langage.

Heureusement, il existe quelques sites web qui présentent le contenu de la SL. Mais manque de chance pour les anglophobes, toutes les références intéressantes sont en anglais.

L'autre solution est de me faire confiance et découvrir le tout via ce cours. Je ne pourrai bien sûr pas tout vous présenter, mais on va faire le tour de l'essentiel.

Voici trois sources que j'utilise régulièrement. Elles ne sont pas toutes complètes, mais elles suffisent dans la plupart des cas. Je les ai classées de la plus simple à suivre à la plus compliquée :

  1. cplusplus.com – Une documentation plus simple qui présente l'ensemble de la SL. Les explications ne sont pas toujours complètes, mais elles sont accompagnées d'exemples simples qui permettent de bien comprendre l'intérêt de chaque fonction et de chaque classe.

  2. Apache C++ – Une bonne documentation de la SL en général. Les fonctions sont accompagnées d'exemples simples permettant de comprendre le fonctionnement de chacune d'elles. Elle est surtout intéressante pour sa partie sur les flux.

  3. sgi – Une documentation très complète de la STL. La description n'est pas toujours aisée à lire pour un débutant, et certains éléments présentés ne font pas partie de la STL standard mais seulement d'une version proposée par SGI. Présente uniquement la STL.

Découvrez des fonctionnalités héritées du C

Le C++ étant en quelque sorte un descendant du C, la totalité de la bibliothèque standard du C est disponible dans la SL :

  • il y a quelques outils qui sont toujours utilisés ;

  • d'autres qui ont été remplacés par des versions améliorées ;

  • et finalement d'autres qui sont totalement obsolètes.

J'espère ne pas vous décevoir en ne parlant que des éléments utiles. C'est déjà beaucoup !

Comme tout le reste de la SL, la partie héritée du C est séparée en différents fichiers d'en-tête plus ou moins cohérents.

L'en-tête cmath

C'est dans ce fichier que sont définies toutes les fonctions mathématiques usuelles :

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
    double a(4.3), b(5.2);
    cout << pow(a,b) << endl;    //Calcul de a^b
    cout << sqrt(a) << endl;     //Calcul de la racine carrée de a
    cout << cos(b) << endl;      //Calcul du cosinus de b
    return 0;
}

C'est le fichier à inclure lorsque vous avez des calculs mathématiques à effectuer.

L'en-tête cctype

Ce fichier propose quelques fonctions pour connaître la nature d'un char  . Quand on manipule du texte, on doit souvent répondre à des questions comme :

  • Cette lettre est-elle une majuscule ou une minuscule ?

  • Ce caractère est-il un espace ?

  • Ce symbole est-il un chiffre ?

Les fonctions présentes dans l'en-tête cctype sont là pour cela. Pour tester si un char donné est un chiffre, par exemple, on utilisera la fonction isdigit() :

#include <iostream>
#include <cctype>
using namespace std;

int main()
{
    cout << "Entrez un caractere : ";
    char symbole;
    cin >> symbole;

    if(isdigit(symbole))
        cout << "C'est un chiffre." << endl;
    else
        cout << "Ce n'est pas un chiffre." << endl;
    
    return 0;
}

Comme vous le voyez, c'est vraiment très simple à utiliser.

Le tableau suivant présente les fonctions les plus utilisées de cet en-tête :

Nom de la fonction

Description

isalpha()

Vérifie si le caractère est une lettre.

isdigit()

Vérifie si le caractère est un chiffre.

islower()

Vérifie si le caractère est une minuscule.

isupper()

Vérifie si le caractère est une majuscule.

isspace()

Vérifie si le caractère est un espace ou un retour à la ligne.

En plus de cela, il y a deux fonctions, tolower()  et toupper()  , qui convertissent une majuscule en minuscule et inversement. On peut ainsi aisément transformer un texte en majuscules :

#include <iostream>
#include <cctype>
#include <string>
using namespace std;

int main()
{
    cout << "Entrez une phrase : " << endl;
    string phrase;
    getline(cin, phrase);

    //On parcourt la chaîne pour la convertir en majuscules
    for(int i(0); i<phrase.size(); ++i)
    {
         phrase[i] = toupper(phrase[i]);
    }

    cout << "Votre phrase en majuscules est : " << phrase << endl;
    return 0;
}

Je vous laisse vous amuser un peu avec ces fonctions. Essayez par exemple de réaliser un programme qui remplace tous les espaces d'une string par le symbole #  . 

L'en-tête ctime

Ce fichier d'en-tête contient plusieurs fonctions liées à la gestion du temps. La plupart sont assez bizarres à utiliser, et donc peu utilisées.

De toute façon, la plupart des autres bibliothèques proposent des classes pour gérer les heures, les jours et les dates de manière plus aisée.

#include <iostream>
#include <ctime>
using namespace std;

int main()
{
    int secondes = time(0);
    cout << "Il s'est ecoule " << secondes << " secondes depuis le 01/01/1970." << endl;
    return 0;
}

La fonction attend en argument un pointeur sur une variable dans laquelle stocker le résultat. Mais bizarrement, elle renvoie aussi ce résultat comme valeur de retour. L'argument est donc en quelque sorte inutile.

Ce qui donne :

Il s'est ecoule 1302471754 secondes depuis le 01/01/1970.

Euh… Mais à quoi ça sert ?

Il y a principalement trois raisons d'utiliser cette fonction :

  1. Calculer la date. Avec un petit peu d'arithmétique, on retrouve facilement la date et l'heure actuelles. Mais comme je vous l'ai dit, la plupart des bibliothèques proposent des outils plus simples pour cela.

  2. Calculer le temps que met le programme à s'exécuter. On appelle la fonction time() en début de programme, puis une deuxième fois à la fin. Le temps passé dans le programme sera simplement la différence entre les deux valeurs obtenues !

  3. Générer des nombres aléatoires. Nous allons voir comment dans la suite.

L'en-tête cstdlib

Voyons comment générer des nombres aléatoires.

La fonction rand() renvoie un nombre au hasard entre 0 et RAND_MAX  (un très grand nombre, généralement plus grand que $$$10^9$$$). Si l'on souhaite obtenir un nombre au hasard entre 0 et 10, on utilise l'opérateur modulo (%).

nb = rand() % 10; //nb prendra une valeur au hasard entre 0 et 9 compris.

Jusque-là, rien de bien compliqué. Le problème est qu'un ordinateur ne sait pas générer un nombre au hasard. Tout ce qu'il sait faire, c'est créer des suites de nombres qui ont l'air aléatoires. Il faut donc spécifier un début pour la séquence. Et c'est là qu'intervient la fonction srand()  : elle permet de spécifier le premier terme de la suite.

Le problème est que si l'on donne chaque fois le même premier terme à l'ordinateur, il génère à chaque fois la même séquence ! Il faut donc lui donner quelque chose de différent à chaque exécution du programme. Et qu'est-ce qui change à chaque fois que l'on exécute un programme ? La date et l'heure, bien sûr !

La solution est donc d'utiliser le résultat de la fonction time() comme premier terme de la série.

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int main()
{
    srand(time(0));    //On initialise la suite de nombres aléatoires

    for(int i(0); i<10; ++i) 
        cout << rand() % 10 << endl;  //On génère des nombres au hasard

    return 0;
}

Les autres en-têtes

Mis à part cassert dont nous parlerons plus tard, le reste des 15 en-têtes du C n'est que très rarement utilisé en C++. Je ne vous en dirai donc pas plus dans ce cours.

Bon, assez travaillé avec les reliques du C !

Pour l'instant, je ne vous ai pas présenté de grandes révolutions pour vos programmes comme je vous l'avais promis. Ne le dites pas trop fort si vous rencontrez des amateurs de C, mais c'est parce qu'on n'a pas encore utilisé la puissance du C++. Attachez vos ceintures, la suite du voyage va secouer !

En résumé

  • La bibliothèque standard du C++ propose de nombreuses briques de base pour simplifier l'écriture de nos programmes.

  • On peut considérer qu'elle est découpée en trois parties : la STL, les flux, et tout ce qui a été repris du langage C.

  • Parmi les éléments repris du C, on utilise principalement cctype pour analyser des lettres, ctime pour la mesure du temps, et cstdlib pour générer des nombres aléatoires.

Maintenant que nous en savons un peu plus sur la bibliothèque standard, il est temps de voir comment l’utiliser, en commençant par les conteneurs.

Exemple de certificat de réussite
Exemple de certificat de réussite