9Comment std::vector gère-t-il la capacité, la croissance, la réallocation et la stabilité des itérateurs ?
std::vector stocke les éléments de manière contiguë et suit à la fois la taille et la capacité. size est le nombre d’éléments construits ; capacity est la quantité de stockage d’éléments allouée disponible avant qu’une autre allocation soit nécessaire. Lorsque l’ajout d’éléments dépasserait la capacité, vector alloue un bloc plus grand, typiquement avec une stratégie de croissance géométrique définie par l’implémentation, déplace ou copie les éléments existants, détruit les anciens et libère l’ancien stockage. reserve(n) augmente la capacité sans changer la taille, tandis que resize(n) change la taille en construisant ou détruisant des éléments. Une réallocation invalide tous les itérateurs, références et pointeurs vers les éléments ; même sans réallocation, des opérations comme insert et erase peuvent invalider les positions au niveau du point de modification ou après celui-ci.
Essayer de répondre à cette question avec un coach IA
10Quelles règles d’invalidation faut-il connaître pour les conteneurs standard contigus et à nœuds ?
Les règles d’invalidation dépendent du conteneur et de l’opération. Les conteneurs contigus comme vector et string ont une stabilité fragile des itérateurs/références : la croissance peut réallouer et invalider tous les itérateurs, références et pointeurs, et insert/erase peuvent décaler des éléments et invalider les positions au niveau du changement ou après celui-ci même sans réallocation. Les conteneurs ordonnés à nœuds comme list, map, set et leurs variantes multi conservent généralement les itérateurs et références vers les éléments existants non effacés lors d’une insertion ; effacer un élément invalide l’itérateur/la référence vers cet élément effacé. Les conteneurs unordered stockent également les éléments dans des nœuds, donc les références et pointeurs vers les éléments restent généralement stables lors d’un rehash, mais un rehash invalide les itérateurs. deque a des règles spéciales de stockage segmenté. En pratique, vérifiez le conteneur et l’opération spécifiques avant de conserver des itérateurs ou références à travers des modifications.
Essayer de répondre à cette question avec un coach IA
11Comparez std::map, std::unordered_map et les conteneurs de style flat-map pour des tables de recherche backend.
std::map est un conteneur associatif ordonné, généralement basé sur un arbre, avec des opérations de recherche/insertion/suppression logarithmiques ; il est utile lorsque l’itération triée, les requêtes par intervalle ou les garanties d’ordre sont importantes. std::unordered_map est basé sur une table de hachage, avec des opérations par clé exacte en temps constant en moyenne et sans ordre des clés ; c’est souvent un bon choix par défaut pour de grandes tables de recherche mutables lorsque le hachage est de bonne qualité. Un conteneur de style flat-map stocke des paires clé/valeur triées de manière contiguë, ce qui donne une bonne localité de cache ainsi qu’une itération et une recherche par dichotomie rapides, mais l’insertion et la suppression au milieu sont linéaires. Pour des tables de recherche backend, le choix dépend du besoin d’ordre ou d’intervalles, de recherches principalement exactes, de mutations fréquentes, d’une latence prévisible, du surcoût mémoire et du comportement vis-à-vis du cache.
Essayer de répondre à cette question avec un coach IA
12Expliquez std::optional et ses cas d’utilisation backend typiques pour représenter des valeurs absentes.
std::optional<T> représente soit une valeur T contenue, soit l’absence de valeur. L’état vide est représenté par std::nullopt ; le code peut vérifier has_value() ou utiliser l’optional dans un contexte booléen, accéder à la valeur avec * ou value(), et fournir une valeur par défaut avec value_or(). Dans du code backend, il est utile pour les champs de base de données nullable, les champs de requête ou de configuration optionnels, les absences en cache ou en dépôt lorsque l’absence est attendue, et les états métier où une sentinelle comme -1 ou une chaîne vide serait ambiguë. Il modélise l’absence d’une valeur, pas le polymorphisme ni des informations d’erreur riches.
Essayer de répondre à cette question avec un coach IA
13Que sont std::string_view et std::span, et quels dangers de durée de vie les vues non propriétaires introduisent-elles ?
std::string_view est une vue non propriétaire sur une séquence contiguë de caractères ; std::span<T> est une vue non propriétaire sur une séquence contiguë de T. Elles sont utiles pour les paramètres sans copie et les API de tampons, car elles transportent un pointeur et une longueur sans allouer ni posséder la mémoire. Le principal danger est la durée de vie : le stockage référencé doit vivre plus longtemps que la vue et ne doit pas être invalidé pendant l’utilisation de la vue. Retourner ou stocker une vue vers un temporaire, un objet local, un objet détruit ou un conteneur réalloué peut laisser une vue pendante.
Essayer de répondre à cette question avec un coach IA