Synthèse


Ce qu’il faut retenir

Théorie
  • Un conteneur séquentiel est un conteneur dans lequel les élements se suivent (tableaux, listes, …).
  • Un conteneur associatif est un conteneur dans lequel chaque élément est indexé par une clef (l’élément pouvant être la clef elle-même).
  • Les types passés en paramètre de template doivent parfois respecter des contraintes pour compiler (ces contraintes sont spécifiées dans la documentation).
Librairie standard
  • Tableau de taille dynamique : vector
  • Tableau de taille fixe : array
  • Listes chaînées : list ou forward_list
  • Ensembles : set ou unordered_set
  • Dictionnaires : map ou unordered_map
Pratique
  • On peut passer les chaînes de caractères constantes par std::string_view plutôt que const std::string& ou const char*.
  • Si une classe définit une constructeur acceptant un paramètre de type initializer_list, alors il faut forcément utiliser la syntaxe (...) plutôt que { ... } pour appeler un autre constructeur.
  • On peut écrire values[idx] si values est un tableau primitif ou si la classe de values définit un operator[].
Méthodologie
  • Pour savoir comment utiliser une classe ou fonction, commencer par regarder l’exemple fourni dans la doc.

Ce qu’il faut savoir faire

Langage
  • Définir un opérateur de comparaison : bool operator<(const ClassName& other) { return /* ... */; }
  • Définir un opérateur d’égalité : bool operator==(const ClassName& other) { return /* ... */; }
Librairie standard
  • Utiliser les fonctions génériques permettant d’accéder ou de manipuler un conteneur : size, empty, clear, emplace_back, insert, erase, etc.
  • Instancier des conteneurs de la librairie standard et les utiliser (en consultant la doc si besoin).
  • Instancier des pair et des tuple.
  • Accéder au n-ième élément d’un tuple : auto& fifth = std::get<4>(my_tuple);
Méthodologie
  • Rechercher dans la documentation comment utiliser une fonction ou une classe (header à inclure, paramètres, contraintes, etc).
  • Utiliser la documentation pour choisir la meilleure classe à utiliser dans une situation donnée (complexité des opérations, espace utilisé, condition d’invalidation des itérateurs, etc).
  • Identifier les “vraies” erreurs dans la sortie du compilateur pour les corriger.

Ce dont il faut à peu près se souvenir

Théorie
  • Un foncteur est un objet qui définit un operator().
Librairie standard
  • Il faut spécialiser la classe std::hash pour Key si on souhaite utiliser Key comme clef d’un unordered_set ou unordered_map.