lang:cpp:boucles
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| lang:cpp:boucles [2020/01/02 07:29] – Ajout de "std::transform" et "std::for_each" root | lang:cpp:boucles [2020/06/16 15:00] (Version actuelle) – Précision sur le style fonctionnel root | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ====La boucle traditionnelle==== | + | =====Boucle sur des données (old style)===== |
| - | ===Intervalle=== | + | ====Conteneur supportant les index==== |
| - | <code cpp> | + | |
| - | for (int i = 0; i < 100; i++) | + | |
| - | std::cout << i << std:: | + | |
| - | </ | + | |
| - | + | ||
| - | Chaque paramètre est optionnel : | + | |
| - | <code cpp> | + | |
| - | int i = 0; | + | |
| - | for (;;) | + | |
| - | { | + | |
| - | if (i >= 100) | + | |
| - | break; | + | |
| - | std::cout << i << std:: | + | |
| - | i++; | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | Et sa version '' | + | |
| - | <code cpp> | + | |
| - | int i = 0; | + | |
| - | while (i < 100) | + | |
| - | { | + | |
| - | std::cout << i << std:: | + | |
| - | i++; | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | ===Conteneur supportant les index=== | + | |
| <code cpp> | <code cpp> | ||
| Ligne 36: | Ligne 8: | ||
| </ | </ | ||
| - | ===Conteneur supportant les itérateurs=== | + | ====Conteneur supportant les itérateurs==== |
| <code cpp> | <code cpp> | ||
| std:: | std:: | ||
| - | std:: | ||
| - | std:: | ||
| // Lecture / écriture | // Lecture / écriture | ||
| - | // Version boucle traditionnelle | + | std:: |
| - | for (itc = vector.begin(); | + | for (it = vector.begin(); |
| - | (*itc)++; | + | (*it)++; |
| - | + | ||
| - | // Version algorithm | + | |
| - | std:: | + | |
| - | vector.begin(), | + | |
| - | vector.end(), | + | |
| - | vector.begin(), | + | |
| - | [](int i) | + | |
| - | { | + | |
| - | return i + 1; | + | |
| - | } | + | |
| - | ); | + | |
| // Lecture seule | // Lecture seule | ||
| - | // Version boucle traditionnelle | + | std:: |
| - | for (it = vector.cbegin(); | + | for (itc = vector.cbegin(); |
| - | std::cout << *it << std::endl; | + | std::cout << *itc << std::endl; |
| + | </ | ||
| - | // Version algorithm | + | =====Programmation fonctionnelle===== |
| - | std:: | + | |
| - | vector.cbegin(), | + | |
| - | vector.cend(), | + | |
| - | [](int i) | + | |
| - | { | + | |
| - | std::cout << i << std:: | + | |
| - | } | + | |
| - | ); | + | |
| - | </ | + | |
| ====for each==== | ====for each==== | ||
| Ligne 80: | Ligne 31: | ||
| <code cpp> | <code cpp> | ||
| std:: | std:: | ||
| - | for (int i : arr) | + | // Ici, on utilise const & pour conserver le style fonctionnel. |
| + | // Mais passer en copie un type primitif n'est pas plus penalisant que d' | ||
| + | for (const int& i : arr) | ||
| std::cout << i << std::endl; | std::cout << i << std::endl; | ||
| </ | </ | ||
| Ligne 93: | Ligne 46: | ||
| </ | </ | ||
| - | ===Conteneur multi-types ('' | + | ===Conteneur multi-types (map, tuple, ...)=== |
| <code cpp> | <code cpp> | ||
| - | std:: | + | std:: |
| // L' | // L' | ||
| + | // const s' | ||
| for (const auto & [key, value] : map) | for (const auto & [key, value] : map) | ||
| std::cout << value << std::endl; | std::cout << value << std::endl; | ||
| </ | </ | ||
| - | ===Sur une classe personnalisée=== | + | L' |
| + | |||
| + | <code cpp> | ||
| + | std:: | ||
| + | { | ||
| + | std:: | ||
| + | std:: | ||
| + | std:: | ||
| + | for(; __begin1.operator!=(__end1); | ||
| + | { | ||
| + | const std:: | ||
| + | std:: | ||
| + | std:: | ||
| + | std:: | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===Implémentation sur une classe personnalisée=== | ||
| Il faut définir l' | Il faut définir l' | ||
| - | L'exemple ci-dessous se passe de '' | + | Dans l'idéal, '' |
| Il faut commencer par déclarer l' | Il faut commencer par déclarer l' | ||
| Ligne 211: | Ligne 183: | ||
| </ | </ | ||
| - | ===Via une coroutine=== | + | ====Ranges==== |
| + | |||
| + | Les '' | ||
| + | |||
| + | * Boucle | ||
| + | |||
| + | <code cpp> | ||
| + | #include < | ||
| + | |||
| + | for (int i : std:: | ||
| + | std::cout << i << std:: | ||
| + | </ | ||
| + | |||
| + | * Pour faire la boucle à l' | ||
| + | |||
| + | <code cpp> | ||
| + | #include < | ||
| + | |||
| + | for (int i : std:: | ||
| + | std::cout << i << std:: | ||
| + | |||
| + | </ | ||
| + | |||
| + | * S' | ||
| + | |||
| + | <code cpp> | ||
| + | #include < | ||
| + | |||
| + | for (int i : std:: | ||
| + | std::cout << i << std:: | ||
| + | </ | ||
| + | |||
| + | * Filter les valeurs : | ||
| + | |||
| + | <code cpp> | ||
| + | #include < | ||
| + | |||
| + | for (int i : std:: | ||
| + | std::cout << i << std:: | ||
| + | </ | ||
| + | |||
| + | * Modifier les valeurs dans la vue : | ||
| + | |||
| + | <code cpp> | ||
| + | #include < | ||
| + | |||
| + | int main() { | ||
| + | for (const std:: | ||
| + | // Integer | ||
| + | std:: | ||
| + | // const char * | ||
| + | std:: | ||
| + | if (i % 15 == 0) | ||
| + | return " | ||
| + | else if (i % 3 == 0) | ||
| + | return " | ||
| + | else if (i % 5 == 0) | ||
| + | return " | ||
| + | else | ||
| + | return ""; | ||
| + | })) | ||
| + | std::cout << i << std:: | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <WRAP center round important 60%> | ||
| + | Les vues sont en lecture seule | ||
| + | </ | ||
| + | |||
| + | Le code | ||
| + | <code cpp> | ||
| + | int main() { | ||
| + | std:: | ||
| + | for (int & i : | ||
| + | v | | ||
| + | | ||
| + | i = 3; | ||
| + | for (const int & i : v) | ||
| + | std::cout << i << " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | affichera | ||
| + | |||
| + | < | ||
| + | 1 | ||
| + | 2 | ||
| + | 3 | ||
| + | 4 | ||
| + | 5 | ||
| + | 6 | ||
| + | 7 | ||
| + | 8 | ||
| + | 9 | ||
| + | </ | ||
| + | |||
| + | * Ne prendre que les premiers résultats | ||
| + | |||
| + | <code cpp> | ||
| + | #include < | ||
| + | |||
| + | int main() { | ||
| + | for (int i : | ||
| + | | ||
| + | | ||
| + | std::cout << i << std:: | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | =====Via une coroutine===== | ||
| <code cpp> | <code cpp> | ||
| Ligne 234: | Ligne 315: | ||
| </ | </ | ||
| - | ====Algorithmes==== | ||
| - | ===mismatch=== | ||
| - | Comparer deux classes itérables. | ||
| - | |||
| - | Ici, comparaison de deux string insensible à la casse. | ||
| - | |||
| - | <code cpp> | ||
| - | #include < | ||
| - | #include < | ||
| - | #include < | ||
| - | |||
| - | std::string un = " | ||
| - | std::string deux = " | ||
| - | |||
| - | std:: | ||
| - | std:: | ||
| - | un.cbegin(), | ||
| - | un.cend(), | ||
| - | deux.cbegin(), | ||
| - | deux.cend(), | ||
| - | [](char un, char deux) | ||
| - | { | ||
| - | return std:: | ||
| - | }); | ||
| - | |||
| - | if (retval == std:: | ||
| - | std::cout << " | ||
| - | else | ||
| - | std::cout << " | ||
| - | </ | ||
lang/cpp/boucles.1577946543.txt.gz · Dernière modification : de root
