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 siv
es unvector<T, Allocator>
dondeT
es un tipo distinto debool
, entonces obedece a la identidad&v[n] == &v[0] + n
para todos0 <= 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.