libreria iterador español ejemplo c++ stl vector

iterador - stl c++ español



¿Es seguro asumir que el almacenamiento de vectores STL es siempre contiguo? (6)

El almacenamiento siempre es contiguo, pero puede moverse a medida que se cambia la capacidad del vector.

Si tenía un puntero, referencia o iterador en el elemento cero (o cualquier elemento) antes de una operación de cambio de capacidad, se invalida y debe reasignarse.

Si tiene un vector STL que ha sido redimensionado, ¿es seguro tomar la dirección del elemento 0 y asumir que el resto del vector seguirá en la memoria?

p.ej

vector<char> vc(100); // do some stuff with vc vc.resize(200); char* p = &vc[0]; // do stuff with *p


El estándar C ++ 03 agregó texto para dejar en claro que los elementos vectoriales deben ser contiguos.

C ++ 03 23.2.4 El párrafo 1 contiene el siguiente lenguaje que no figura en el documento estándar de C ++ 98:

Los elementos de un vector se almacenan contiguamente, lo que significa que si v es un vector<T, Allocator> donde T es un tipo distinto de bool , entonces obedece a la identidad &v[n] == &v[0] + n para todos 0 <= n < v.size() .

Herb Sutter habla sobre este cambio en una de sus entradas de blog, Cringe no: se garantiza que los vectores sean contiguos :

... la contigüidad es, de hecho, parte de la abstracción del vector. Es tan importante, de hecho, que cuando se descubrió que el estándar C ++ 98 no garantizaba por completo la contigüidad, se enmendó el estándar C ++ 03 para agregar explícitamente la garantía.


sí.

siempre debería ser contiguo



std::vector garantiza que los elementos se almacenan en una matriz contigua y, por lo tanto, es la sustitución preferida de las matrices y también se puede utilizar para interactuar con el código de bajo nivel dependiente de la plataforma (como las llamadas API de Win32). Para obtener un puntero a la matriz, use:

&myVector.front();


Sí, esa es una suposición válida (*).

Del estándar C ++ 03 (23.2.4.1):

Los elementos de un vector se almacenan contiguamente, lo que significa que si v es un vector donde T es un tipo distinto de bool, entonces obedece a la identidad & v [n] == & v [0] + n para todos 0 <= n <v .tamaño().

(*) ... pero ten cuidado con la matriz reasignada (invalidando cualquier puntero e iterador) después de agregarle elementos.