Outils d'utilisateurs

Outils du Site


c_1y_-_les_tableaux

Différences

Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.

Lien vers cette vue

c_1y_-_les_tableaux [2014/03/15 18:24]
78.251.123.223 geomtery -> geometry
c_1y_-_les_tableaux [2020/10/25 03:52] (Version actuelle)
issam Correction nom de variable
Ligne 6: Ligne 6:
   * [[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3824.htm|N3824]], qui propose l'ajout d'une fonction //make_array// pour créer des tableaux statiques [[http://en.cppreference.com/w/cpp/container/array|std::array]] ;   * [[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3824.htm|N3824]], qui propose l'ajout d'une fonction //make_array// pour créer des tableaux statiques [[http://en.cppreference.com/w/cpp/container/array|std::array]] ;
   * [[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3869.html|N3869]] et [[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3870.html|N3870]], pour étendre l'utilisation de [[http://en.cppreference.com/w/cpp/memory/shared_ptr|std::shared_ptr]] et [[http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared|std::make_shared]] aux tableaux style C ;   * [[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3869.html|N3869]] et [[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3870.html|N3870]], pour étendre l'utilisation de [[http://en.cppreference.com/w/cpp/memory/shared_ptr|std::shared_ptr]] et [[http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared|std::make_shared]] aux tableaux style C ;
-  * [[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3851.pdf|N3851]], qui propose l'ajout des tableaux à plusieurs dimensions.+  * [[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3851.pdf|N3851]] et la mise à jour [[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3976.html|N3976]], qui propose l'ajout des tableaux à plusieurs dimensions.
  
 ===== Les tableaux de taille connue à l'exécution ===== ===== Les tableaux de taille connue à l'exécution =====
Ligne 20: Ligne 20:
  
 <code cpp> <code cpp>
-auto t1 = {0, 1, 2, 3}; // tableau d'entier +int t1[] = {0, 1, 2, 3}; // tableau de 4 entiers 
-int t2[] = {0, 1, 2, 3}; // déclaration explicite du type +auto s = "un chaine"; // tableau de caractères constants (const char)
-auto s = "un chaine"; // tableau de caractères const char*+
 </code> </code>
  
Ligne 39: Ligne 38:
 <code cpp> <code cpp>
 std::array<int, 4> a1 = {0, 1, 2, 3}; // tableau d'entier std::array<int, 4> a1 = {0, 1, 2, 3}; // tableau d'entier
-std::find(begin(a1), end(t1), 2); // itérateurs+std::find(begin(a1), end(a1), 2); // itérateurs
 </code> </code>
  
Ligne 164: Ligne 163:
 </code> </code>
  
-Un point important à noter lors de l'utilisation de ce type de tableau. Ces tableaux sont alloués sur la pile, qui a une taille limitée (différente selon le système et les options de compilation). Lorsque l'on souhaite créer des tableaux de taille importante, il faut utiliser des tableaux dynamiques std::vector. Lors de la création d'un tableau de taille fixée à l’exécution, si l'allocation échoue à cause d'un manque de mémoire disponible, le comportement est indéterminé (undefined behavior). En pratique, cela signifie que le comportement est laissé à l'appréciation des concepteurs de compilateurs (et donc potentiellement non reproductible selon le compilateur), bien qu'il est encouragé à lancer une exception de type std::bad_array_length (nouveau type d'exception également ajoutée dans ce TS). La seule garantie est que la mémoire sera libérée correctement (local object with automatic storage duration). Remarque : pour le constructeur des conteneurs avec un initializer-list, il est possible de ne pas mettre le signe égal. Il faut faire attention dans ce cas à ne pas confondre les deux syntaxes, avec parenthèses et avec crochets, qui sont visuellement proches, mais ont des comportements totalement différents :+Lors de la création d'un tableau de taille fixée à l’exécution, si l'allocation échoue à cause d'un manque de mémoire disponible, le comportement est indéterminé (undefined behavior). En pratique, cela signifie que le comportement est laissé à l'appréciation des concepteurs de compilateurs (et donc potentiellement non reproductible selon le compilateur), bien qu'il est encouragé à lancer une exception de type std::bad_array_length (nouveau type d'exception également ajoutée dans ce TS). La seule garantie est que la mémoire sera libérée correctement (local object with automatic storage duration). Remarque : pour le constructeur des conteneurs avec un initializer-list, il est possible de ne pas mettre le signe égal. Il faut faire attention dans ce cas à ne pas confondre les deux syntaxes, avec parenthèses et avec crochets, qui sont visuellement proches, mais ont des comportements totalement différents :
  
 <code cpp> <code cpp>
Ligne 294: Ligne 293:
  
 ===== Les tableaux multidimensionnels ===== ===== Les tableaux multidimensionnels =====
 +
 +**EDIT Mai 2018 : les propositions pour les vues sur les tableaux ont été largement modifiées depuis la publication de cet article. Vous pouvez consulter les propositions suivantes :**
 +
 +  * [[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0009r5.html|P0009r5 : Polymorphic Multidimensional Array Reference]]
 +  * [[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0122r6.pdf|P0122r6 : span: bounds-safe views for sequences of objects]]
 +
 +
  
 La manipulation de tableaux multidimensionnels est un problème classique en C++. Il est possible d'utiliser des solutions génériques, comme Boost.MultiArray, ou domaine spécifique, comme les outils de manipulation des images (Boost.GIL), la géométrie (Boost.Geometry) ou des matrices (Boost.uBLAS). Le draft N3851 propose d'ajouter ce type de tableau dans le C++. La création de tableaux à plusieurs dimensions pose un certain nombre de problématique sur : La manipulation de tableaux multidimensionnels est un problème classique en C++. Il est possible d'utiliser des solutions génériques, comme Boost.MultiArray, ou domaine spécifique, comme les outils de manipulation des images (Boost.GIL), la géométrie (Boost.Geometry) ou des matrices (Boost.uBLAS). Le draft N3851 propose d'ajouter ce type de tableau dans le C++. La création de tableaux à plusieurs dimensions pose un certain nombre de problématique sur :
Ligne 320: Ligne 326:
  
 <code cpp> <code cpp>
-bounds b1(5); // tableau 1D avec 5 éléments +bounds<1> b1(5); // tableau 1D avec 5 éléments 
-bounds b2({4, 5, 6}); // tableau 3D, avec 4 éléments dans +bounds<3> b2({4, 5, 6}); // tableau 3D, avec 4 éléments dans 
     // la première dimension, 5 éléments dans la seconde et     // la première dimension, 5 éléments dans la seconde et
     // 6 éléments dans la dernière     // 6 éléments dans la dernière
-bounds<3> b3({4, 5, 6}); // dimensions explicite 
 </code> </code>
  
Ligne 487: Ligne 492:
  
 Remarque importante : les fonctions présentées dans cet articles ne sont pas encore  implémentées dans GCC, je n'ai pas testé les codes d'exemple donnés dans cet article. Certaines images et codes d'exemples proviennent directement des drafts du comité C++. Remarque importante : les fonctions présentées dans cet articles ne sont pas encore  implémentées dans GCC, je n'ai pas testé les codes d'exemple donnés dans cet article. Certaines images et codes d'exemples proviennent directement des drafts du comité C++.
 +
 +==== Mise à jour ====
 +
 +  * Mise à jour du draft [[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3976.html|N3976]] "Multidimensional bounds, index and array_view, revision 2", qui remplace N3851.
 +    * Ajout d'un header <array_view>, qui contient les classes ''array_view'' et ''stride_array_view'' ;
 +    * Ajout d'un header <coordinate>, qui contient les classes utilitaires permettant de gérer des coordonnées (index, bounds et bounds_iterator).
 +  * Correction : suppression syntaxe du constructeur avec déduction de l'argument template (où j'ai pondu un truc pareil...)
  
 {{tag> C++ C++1y}} {{tag> C++ C++1y}}
c_1y_-_les_tableaux.1394904299.txt.gz · Dernière modification: 2014/03/15 18:24 par 78.251.123.223