Contiguïté de stockage des éléments vectoriels STL
Lorsque vous travaillez avec des vecteurs STL, il est essentiel de comprendre la disposition de la mémoire de leurs éléments. Une question courante se pose : si un vecteur a été redimensionné, peut-on supposer en toute sécurité que ses éléments sont stockés de manière contiguë en mémoire ?
Analyse
La norme C 03 (23.2 .4.1) fournit la réponse :
The elements of a vector are stored contiguously, meaning that if v is a vector where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().
En termes plus simples, cela signifie que l'adresse du premier élément (&v[0]) d'un vecteur est égal à l'adresse de son n-ième élément (&v[n]) plus le décalage de n. Ceci s'applique aux vecteurs contenant des types de données autres que les booléens.
Exemple
Considérons le code suivant :
vector<char> vc(100); // do some stuff with vc vc.resize(200); char* p = &vc[0]; // do stuff with *p
Selon la norme, nous peut supposer en toute sécurité qu'après avoir redimensionné le vecteur, l'adresse stockée dans p fournira un accès contigu aux 200 éléments du vecteur. En effet, les éléments du vecteur sont garantis d'être stockés les uns après les autres en mémoire, permettant un parcours et un accès efficaces.
Attention
Cependant, c'est important à noter que lors de l'ajout d'éléments à un vecteur, son stockage peut être réaffecté. Cela peut invalider tous les pointeurs ou itérateurs existants vers les éléments vectoriels, il est donc essentiel d'en tenir compte lorsque vous travaillez avec des vecteurs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!