diff --git a/cpp_basics_for_STL.typ b/cpp_basics_for_STL.typ index 9962388ca3b0f010343a10e71519dc5d774b2525..a9b36524b9edc12512890f9242db94367e0a20c1 100644 --- a/cpp_basics_for_STL.typ +++ b/cpp_basics_for_STL.typ @@ -22,7 +22,7 @@ title: "Contenu", )[ Nous allons voir succinctement quels sont les outils de C++ indispensables pour - pouvoir utiliser la parallélisation sur GPU avec les algorithmes STL. + pouvoir utiliser la parallélisation sur GPU avec les algorithmes STL ] #new-section-slide("Itérateurs") @@ -30,15 +30,14 @@ #slide( title: "Qu'est-ce qu'un itérateur en C++", )[ - Le concept n'est pas strictement similaire au design pattern itérateur. + Le concept n'est pas strictement similaire au design pattern itérateur - Les itérateurs en C++ sont des objets qui permettent de parcourir une - collection. + Les itérateurs en C++ sont des objets qui permettent de parcourir une collection - La collection peut-être virtuelle ou il peut s'agir d'une zone mémoire contigüe. + La collection peut-être virtuelle ou il peut s'agir d'une zone mémoire contigüe - On peut également concevoir l'itérateur comme une généralisation du pointeur en - C++. + On peut également concevoir l'itérateur comme une généralisation du pointeur~en~ + C++ ] #slide(title: "Les types d'itérateurs")[ @@ -69,16 +68,16 @@ title: "Comment utiliser un itérateur", )[ Toutes les collections de la STL proposent une méthode `begin` et `end`. Elles -permettent d'obtenir un itérateur sur le début et la fin de la collection. +permettent d'obtenir un itérateur sur le début et la fin de la collection -L'itérateur le plus basique peut être incrémenté `it++` ou `++it`. +L'itérateur le plus basique peut être incrémenté `it++` ou `++it` L'itérateur bidirectionnel peut aussi être décrémenté `it--` ou `--it` -Selon le type d'itérateur, il est également possible de le déréférencer `*it`. +Selon le type d'itérateur, il est également possible de le déréférencer `*it` S'il est possible d'y accèder aléatoirement, on peut utiliser l'opérateur -`it[i]` pour accèder au ième élément. +`it[i]` pour accèder au i#super[ème] élément Je vous recommande de lire cette page pour plus d'exemples : #link("https://cplusplus.com/reference/iterator") @@ -87,13 +86,13 @@ Je vous recommande de lire cette page pour plus d'exemples : #new-section-slide("Vecteurs") #slide( - title: "Qu'es-ce qu'un vecteur", + title: "Qu'est-ce qu'un vecteur", )[ Un *std::vector* est une collection de la STL. Il s'agit d'un tableau de taille -dynamique. +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`. +`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 @@ -155,15 +154,15 @@ a[5] = 12.3; ] #slide( - title: "Les incovénients du type tableau", + title: "Les inconvé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. + 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. + 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. + d'une zone mémoire ] #slide( @@ -171,34 +170,33 @@ a[5] = 12.3; )[ 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. +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. +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`. +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 `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). +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. +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. Il existe les -`std::span`. +pour profiter des différentes méthodes que nous avons vu, il existe les +`std::span` -Cette structure encapsule simplement un pointeur et la taille de la zone -pointée. +Cette structure encapsule simplement un pointeur et la taille de la zone pointée ] #slide(title: "Exemple de span")[ @@ -225,10 +223,10 @@ delete[] ptr; #slide( title: "Les fonctions anonymes", )[ -De plus en plus de langages proposent un mechanisme pour écrire des fonctions -anonymes, aussi appelées expressions lambda. +De plus en plus de langages proposent un mécanisme pour écrire des fonctions +anonymes, aussi appelées expressions lambda -Depuis C++ 11, il existe un moyen d'écrire des fonctions lambda. La syntaxe +Depuis C++ 11, il existe un moyen d'écrire des fonctions anonymes. La syntaxe simplifiée d'une lambda en C++ est la suivante : ```cpp [captures](paramètres){corps de la fonction} ``` @@ -243,7 +241,7 @@ int x = times_two(3); // x vaut 6 #slide( title: "Les captures", )[ -Les expressions lambda en C++ peuvent capturer leur environnement. +Les expressions lambda en C++ peuvent capturer leur environnement Si je souhaite par exemple ajouter une constante à en entier, je peux écrire : @@ -308,7 +306,7 @@ int x = add_var(10); // x vaut 12 title: "Introduction", )[ La librairie standard propose un ensemble d'algorithmes qui permettent de - travailler avec des itérateurs. + travailler avec des itérateurs Ces algorithmes permettent entre autre de : - initialiser/remplir @@ -318,9 +316,9 @@ int x = add_var(10); // x vaut 12 - supprimer/remplacer des éléments On retrouve des fonctions similaires avec les streams en java, ou les itérateurs - en Rust. + en Rust - Je vous recommande de lire la page suivante pour plus d'information #link("https://en.cppreference.com/w/cpp/algorithm"). + Je vous recommande de lire la page suivante pour plus d'information : #link("https://en.cppreference.com/w/cpp/algorithm") ] #slide(title: "Exemple tri")[