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 [2019/12/27 16:17] – Ajout des boucles en coroutine root | lang:cpp:boucles [2020/06/16 15:00] (Version actuelle) – Précision sur le style fonctionnel root | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====Toutes les boucles==== | + | =====Boucle sur des données (old style)===== |
- | + | ====Conteneur supportant les index==== | |
- | ===La boucle traditionnelle=== | + | |
- | * Intervalle | + | |
- | <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 38: | Ligne 8: | ||
</ | </ | ||
- | Utiliser de préférence la version '' | + | ====Conteneur supportant les itérateurs==== |
- | + | ||
- | * Conteneur | + | |
<code cpp> | <code cpp> | ||
- | std::set< | + | std::vector< |
- | std::set< | + | |
+ | // Lecture / écriture | ||
+ | std::vector< | ||
+ | for (it = vector.begin(); | ||
+ | (*it)++; | ||
- | for (it = set.begin(); it != set.end(); it++) | + | // Lecture seule |
- | std::cout << *it << std::endl; | + | std:: |
+ | for (itc = vector.cbegin(); itc != vector.cend(); itc++) | ||
+ | std::cout << *itc << std::endl; | ||
</ | </ | ||
- | Utiliser de préférence la version '' | + | =====Programmation fonctionnelle===== |
- | ===for each=== | + | ====for each==== |
- | * Conteneur de type primitif | + | ===Conteneur de type primitif=== |
<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; | ||
</ | </ | ||
- | * Conteneur de type non primitif | + | ===Conteneur de type non primitif=== |
<code cpp> | <code cpp> | ||
Ligne 71: | 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; | ||
</ | </ | ||
- | | + | 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 189: | Ligne 183: | ||
</ | </ | ||
- | | + | ====Ranges==== |
+ | |||
+ | Les '' | ||
+ | |||
+ | | ||
+ | |||
+ | <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 211: | Ligne 314: | ||
} | } | ||
</ | </ | ||
+ |
lang/cpp/boucles.1577459878.txt.gz · Dernière modification : 2019/12/27 16:17 de root