Maison >développement back-end >C++ >Les éléments vectoriels STL restent-ils consécutifs en mémoire après le redimensionnement ?

Les éléments vectoriels STL restent-ils consécutifs en mémoire après le redimensionnement ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-16 07:26:03594parcourir

Do STL Vector Elements Remain Consecutive in Memory After Resizing?

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 &amp;v[n] == &amp;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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn