Parenthèse au sujet du placement de const
. Il y a eu un petit débat sur reddit/r/cpp il y 2-3 semaines suite à un post d’un auteur préférant le east const. La communauté est majoritairement west const (même si on pourrait critiquer son incohérence vu qu’elle devrait être const west), pire les CppCoreGuideline présentent un avis tranché sur la question.
Ma tendance est à être east const sur les paramètres et les déclarations de références constantes. En revanche, sur les constantes, je tends à être à l’ouest. Ceci dit, on a constexpr
pour quelques cas maintenant.
Bref, tout ça pour dire, que ce n’est pas grave tant que tu es cohérent.
Tableaux
vecteur
Mais maintenant, j’ai besoin de les stocker.
Pour la moyenne, en fait non. Un istream_itérator est un input iterator, et ça suffit pour accumuler. Pour un calcul de variance, là oui, en revanche: il faut stocker vu que deux passes sont nécessaires.
Maintenant, collégiens et lycéens ne vont pas forcément connaître le terme.
Il en existe même pour stocker des fonctions !
Je n’en aurai pas parlé. J’aurai plus parlé de paires d’éléments et autres agrégats de données comme des coordonnées de points.
des élément
s/$/s/
Commençons avec les tableaux dynamiques, c’est à dire qui peuvent stocker un nombre variable d’éléments et dont la taille peut augmenter ou diminuer à volonté.
La définition originelle qui est partagée par beaucoup langages: un tableau dynamique est un tableau dont la taille ne sera connue qu’à l’exécution. Exemple typique: on lit des notes dans un fichier, on ne sait pas combien il y a de lignes dans le fichier au moment où l’on écrit et compile notre programme. Il faut pouvoir s’adapter dynamiquement.
Le vecteur a une seconde particularité: il est facilement redimensionnable. C’est un double dynamisme en quelques sorte.
Et le fichier correspondant
-> "fichier d’en-tête" correspondant qui permet de l’utiliser[…]"
Voici le lien vers la documentation anglophone
Peut-être une notre de bas de page comme quoi la doc francophone est majoritairement une traduction automatique.
Examinons-la ensemble.
Peut-être un peu prématuré. Montre des exemples avant. Le plus typique: tu remplis et tu parcours pour un calcul de moyenne ou autre.
vector<> const
Pour un vecteur vide, c’est peu bizarre.
std::vector</* type du tableau */> identifiant {};
-> type des éléments du tableau
on peut très bien leur assigner des valeurs
Je n’aime pas ce mot. Il sonne très anglicisme.
[UB]
Dans mes formations je place des phrases comme, "l’UB, c’est parce que vous avez commis une erreur de programmation, il ne fallait pas faire la fête hier soir, le compilateur est en droit de transformer votre code en programme qui envoie un chat en orbite."
int
VS size_t
Il y a de gros débats chez les experts en ce moment. Il s’en dégage que size_t
est une erreur qui a été faite et que l’on se traine. Même si c’est sémantiquement juste, cela implique des problèmes:
- de sécurité quand nos algos nous font décrémenter
- de performances car
UINT_MAX + 1
est défini alors INT_MAX + 1
est une UB. Cela veut dire que le compilateur doit réaliser des vérifications à la compilation ou au pire à l’exécution, cela implique qu’une incrémentation de size_t
coûte régulièrement plus cher qu’une incrémentation de ptr_diff_t
- de pénibilité:
for (auto i=0 ; i!=size(v) ; ++i)
=> warning
Ce type c’est std::size_t. Et c’est ce type que nous allons utiliser.
C’est une super occasion pour sortir auto
, façon de dire: "dans le doute, avec auto
votre variable sera du bon type"
for (/* type d'un élément du tableau */ identifiant : /* tableau à parcourir */)
Sa syntaxe est étrange. certains bouts sont des commentaires, d’autres écrits sans mise en forme (identifiant
). Cette convention d’écriture peut être très surprenante.
Pour l’exemple qui suit, tu utilises endl
alors que tu utilises \n
sur le précédent. Aujourd’hui je suis passé dans le camp des \n
.
void push_back(T&& value);
Il y en a deux de versions de push_back
, et pour être juste, ton exemple qui suit utilise l’autre.
Cela signifie que nous allons ajouter(*)
(*) à la fin
for (int const i : tableau_de_int)
En termes de bonnes pratiques,quand on autorise un entier à s’appeler i ou j, c’est parce qu’il dénote un indice, souvent employé pour parcourir un tableau. Pour référencer une élément de tableau, ce n’est pas idéal.
for (std::string const chaine : tableau_de_string)
Une référence constante est préférable ici.
retrait d’élément
Il y a aussi erase
& cie