Outils pour utilisateurs

Outils du site


lang:cpp:boucles

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
lang:cpp:boucles [2020/02/24 15:21] – Précision sur les vues rootlang: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)===== 
-<note important>Obsolète. Voir Ranges ci-dessous.</note> +====Conteneur supportant les index====
-===Intervalle=== +
-<code cpp> +
-for (int i 0; i < 100; i++) +
-  std::cout << i << std::endl; +
-</code> +
- +
-Chaque paramètre est optionnel : +
-<code cpp> +
-int i = 0; +
-for (;;) +
-+
-  if (i >= 100) +
-    break; +
-  std::cout << i << std::endl; +
-  i++; +
-+
-</code> +
- +
-Et sa version ''while''+
-<code cpp> +
-int i = 0; +
-while (i < 100) +
-+
-  std::cout << i << std::endl; +
-  i++; +
-+
-</code> +
- +
-===Conteneur supportant les index===+
  
 <code cpp> <code cpp>
Ligne 37: Ligne 8:
 </code> </code>
  
-===Conteneur supportant les itérateurs===+====Conteneur supportant les itérateurs====
 <code cpp> <code cpp>
 std::vector<int> vector{ 10, 20, 30, 40 }; std::vector<int> vector{ 10, 20, 30, 40 };
-std::vector<int>::const_iterator it; 
-std::vector<int>::iterator itc; 
  
 // Lecture / écriture // Lecture / écriture
-for (itc = vector.begin(); itc != vector.end(); itc++) +std::vector<int>::iterator it; 
-  (*itc)++;+for (it = vector.begin(); it != vector.end(); it++) 
 +  (*it)++;
  
 // Lecture seule // Lecture seule
-for (it = vector.cbegin(); it != vector.cend(); it++) +std::vector<int>::const_iterator itc; 
-  std::cout << *it << std::endl;+for (itc = vector.cbegin(); itc != vector.cend(); itc++) 
 +  std::cout << *itc << std::endl;
 </code> </code>
 +
 +=====Programmation fonctionnelle=====
  
 ====for each==== ====for each====
Ligne 58: Ligne 31:
 <code cpp> <code cpp>
 std::array<int, 4> arr = { 10, 20, 30, 40 }; std::array<int, 4> arr = { 10, 20, 30, 40 };
-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'utiliser une référence. 
 +for (const inti : arr)
   std::cout << i << std::endl;   std::cout << i << std::endl;
 </code> </code>
Ligne 71: Ligne 46:
 </code> </code>
  
-===Conteneur multi-types (''std::map''''std::tuple'', ...)===+===Conteneur multi-types (map, tuple, ...)===
  
 <code cpp> <code cpp>
Ligne 77: Ligne 52:
  
 // L'utilisation de auto est obligatoire. // L'utilisation de auto est obligatoire.
 +// const s'applique sur toutes les variables.
 for (const auto & [key, value] : map) for (const auto & [key, value] : map)
   std::cout << value << std::endl;   std::cout << value << std::endl;
Ligne 99: Ligne 75:
 </code> </code>
  
-===Sur une classe personnalisée===+===Implémentation sur une classe personnalisée===
  
 Il faut définir l'itérateur et la classe à parcourir. [[https://www.cprogramming.com/c++11/c++11-ranged-for-loop.html|C++11 range-based for loops]] {{ :lang:cpp:boucles:range-based_for_loops_in_c_11_-_cprogramming.com_2019-12-26_12_35_03_.html |Archive le 26/12/2019}} Il faut définir l'itérateur et la classe à parcourir. [[https://www.cprogramming.com/c++11/c++11-ranged-for-loop.html|C++11 range-based for loops]] {{ :lang:cpp:boucles:range-based_for_loops_in_c_11_-_cprogramming.com_2019-12-26_12_35_03_.html |Archive le 26/12/2019}}
  
-L'exemple ci-dessous se passe de ''template''.+Dans l'idéal, ''DataSample'' devrait prendre une classe en ''template'' plutôt que la classe ''Data'' en dur.
  
 Il faut commencer par déclarer l'itérateur. Il faut commencer par déclarer l'itérateur.
Ligne 207: Ligne 183:
 </code> </code>
  
-===Via une coroutine===+====Ranges====
  
-<code cpp> +Les ''ranges'' de la ''std'' n'implémentent que des algorithmes en $O(1)$. Il n'est donc pas possible de trier des vues.
-#include <experimental/generator> +
-#include <iostream> +
-  +
-std::experimental::generator<int> loop(int iterations) +
-+
-  for (int i = 0; i < iterations; i++) +
-  { +
-    co_yield i; +
-  } +
-+
-  +
-int main() +
-+
-  for (int i : loop(100)) +
-  { +
-    std::cout << i << std::endl; +
-  } +
-+
-</code> +
- +
-====Ranges====+
  
   * Boucle   * Boucle
Ligne 293: Ligne 248:
 </code> </code>
  
-  * Ne prendre que les premiers résultats +<WRAP center round important 60%
- +Les vues sont en lecture seule 
-<code cpp+</WRAP>
-#include <ranges> +
- +
-int main() { +
-  for (int i : +
-       std::views::iota(0, 100) | +
-       std::views::take(10)) +
-    std::cout << i << std::endl; +
-+
-</code> +
- +
-<note important>Les vues sont en lecture seule.</note>+
  
 Le code  Le code 
Ligne 334: Ligne 278:
 9 9
 </code> </code>
 +
 +  * Ne prendre que les premiers résultats
 +
 +<code cpp>
 +#include <ranges>
 +
 +int main() {
 +  for (int i :
 +       std::views::iota(0, 100) |
 +       std::views::take(10))
 +    std::cout << i << std::endl;
 +}
 +</code>
 +
 +=====Via une coroutine=====
 +
 +<code cpp>
 +#include <experimental/generator>
 +#include <iostream>
 + 
 +std::experimental::generator<int> loop(int iterations)
 +{
 +  for (int i = 0; i < iterations; i++)
 +  {
 +    co_yield i;
 +  }
 +}
 + 
 +int main()
 +{
 +  for (int i : loop(100))
 +  {
 +    std::cout << i << std::endl;
 +  }
 +}
 +</code>
 +
lang/cpp/boucles.1582554112.txt.gz · Dernière modification : 2020/02/24 15:21 de root