diff --git a/cpp_basics_for_STL.typ b/cpp_basics_for_STL.typ index 4dff1903760e47802798c37e93395d7e54c8433d..01d35ef880ffe3ccfa60f95ab4f959a2dcf5b5a6 100644 --- a/cpp_basics_for_STL.typ +++ b/cpp_basics_for_STL.typ @@ -86,8 +86,140 @@ Je vous recommande de lire cette page pour plus d'exemples : #new-section-slide("Vecteurs") +#slide( + title: "Qu'es-ce qu'un vecteur", +)[ +Un *std::vector* est une collection de la STL. Il s'agit d'un tableau de taille +dynamique. + +La mémoire est gérée par l'objet. Il n'y a donc pas besoin de l'allouer avec +`malloc` ou de la libérer avec `free`. + +Il est possible, par exemple, de l'allouer comme un tableau ou de lui donner un +taille fixe et une valeur de remplissage + +```cpp +std::vector<int> v = {1, 2, 3, 4}; +size_t n = 100; +std::vector<float> v1(n, 0.0); +``` +] + +#slide( + title: "Autres méthodes intéressantes d'un vecteur", +)[ +Il est possible de récupérer un pointeur sur les données du vecteur en utilisant +la méthode `data` : + +```cpp +std::vector<int> v = {1, 2, 3, 4}; +int* ptr = v.data(); +``` + +Grâce aux méthodes `begin` et `end`, on peut également itérer sur le vecteur +avec une range-for loop : + +```cpp +std::vector<int> v = {1, 2, 3, 4}; +for (int &i : v){ + i = 2*i; +} +``` + +Il est possible de redimensionner le vecteur à l'aide de la méthode `resize` +] + #new-section-slide("Tableaux et Spans") +#slide( + title: "Le type tableau (C-style array)", +)[ +En C++, il existe un type tableau. On peut par exemple déclarer un tableau +statique de cette manière : + +```cpp +int a[3] = {1, 2, 3}; // Déclaration statique +``` + +On peut aussi déclarer un tableau dynamique sur le tas de cette manière : + +```cpp +int *a = new int[100]; // Allocation dynamique + +delete[] a; // Libération de la mémoire +``` + +On accède aux éléments d'un tableau avec l'opérateur `[]`, par exemple : ```cpp +a[5] = 12.3; +``` +] + +#slide( + title: "Les incovénients du type tableau", +)[ + Le type tableau est un héritage du C. Comme c'est le cas en C, si le tableau est + casté en pointeur, on perd l'information sur la taille du tableau. + + Si le tableau est alloué dynamiquement, il faut gérer la mémoire. + + Le type tableau ne propose aucune propriété, ni méthode. Il s'agit uniquement + d'une zone mémoire. +] + +#slide( + title: "Le type std::array", +)[ +La STL propose une collection pour les tableaux statiques, `std::array`. Cette +collection combine les perfomances d'un simple tableau, et les avantages d'une +collection STL. + +On peut l'initialiser de cette manière : ```cpp +std::array<int, 3> a2 = {1, 2, 3}; +``` + +Comme c'est un tableau statique, il n'est pas nécessaire de libérer la mémoire. + +Le type `std::array` offre, entre autres, les méthodes `data`, `begin` ou `end`. + +La méthode `size` permet de connaître la taille du tableau. + +La méthode `at` permet d'accèder à un élément du tableau en vérifiant que +l'index passé est valide (bounds-check). +] + +#slide( + title: "Les spans", +)[ +Il peut arriver que nous ayons uniquement un tableau simple ou un pointeur vers +des données. En résumé, une simple zone mémoire. + +Si nous voulons pouvoir utiliser notre zone mémoire comme une collection STL, +pour profiter des différentes méthodes que nous avons vu, par exemple. Il existe +les `std::span`. + +Cette structure encapsule simplement un pointeur et la taille de la zone +pointée. +] + +#slide(title: "Exemple de span")[ +```cpp +int *ptr = new int[5]; +std::span<int> sp{ptr, 5}; + +int i = 0; +for(int &val: sp){ + val = i++; +} + +auto mid = sp.subspan(1, 3); +for(int &val: mid){ + val *= -1; +} + +delete[] ptr; +``` +] + #new-section-slide("Closures") #new-section-slide("Algorithmes STL")