Programmation • IoT

Résumé – Chap 6 – std::vector et les conteneurs modernes

La gestion manuelle d’un tableau dynamique impose au programmeur de s’occuper de l’allocation avec new[], de la libération avec delete[], de la taille de la zone, ainsi que des éventuelles opérations de copie ou de redimensionnement. Les conteneurs de la bibliothèque standard prennent en charge cette gestion et std::vector constitue le conteneur séquentiel dynamique le plus courant. Il stocke ses éléments dans une zone mémoire contiguë et applique le principe RAII : la mémoire qu’il possède est automatiquement libérée lors de sa destruction. Un vector peut être créé vide puis agrandi avec push_back(), ou être construit directement avec un certain nombre d’éléments. Sa taille n’est pas une limite fixée à la construction : elle peut évoluer pendant l’exécution. La méthode size() indique le nombre d’éléments effectivement présents, tandis que capacity() indique combien d’éléments peuvent être stockés dans la zone actuellement réservée sans nouvelle allocation. La capacité peut donc être supérieure à la taille, car vector réserve généralement de la mémoire par blocs afin d’éviter une allocation à chaque ajout. Lorsque cette capacité devient insuffisante, une zone plus grande est allouée, les éléments existants y sont copiés ou déplacés, puis l’ancienne zone est libérée. La méthode reserve() permet d’anticiper cette opération en réservant une capacité minimale sans modifier le nombre d’éléments, alors que resize() modifie réellement la taille du vector.

Les éléments peuvent être parcourus par indice ou avec une boucle for fondée sur une plage. L’opérateur [] donne un accès direct sans contrôle des limites, tandis que at() effectue une vérification et signale un accès hors limites. Des opérations comme pop_back() ou clear() permettent de retirer des éléments, et data() fournit l’adresse du premier élément de la zone contiguë, ce qui permet notamment de constater expérimentalement les changements d’adresse provoqués par certaines réallocations. Cette propriété met en évidence une règle importante : lorsqu’un vector réalloue sa mémoire, les pointeurs, références et itérateurs qui désignaient ses anciens éléments peuvent devenir invalides. std::vector remplace ainsi avantageusement un grand nombre d’utilisations des tableaux dynamiques gérés manuellement, tout en conservant une organisation mémoire contiguë et un accès rapide par indice. Il n’est cependant qu’un conteneur parmi d’autres : array représente un tableau de taille fixe, deque une séquence adaptée aux opérations aux deux extrémités, list une liste chaînée, tandis que set, map et leurs variantes non ordonnées répondent à d’autres besoins de stockage et de recherche. Le choix d’un conteneur dépend donc de la manière dont les données doivent être organisées, parcourues, recherchées, ajoutées ou supprimées, plutôt que de la seule nécessité de stocker plusieurs objets.