2008-10-29 8 views

Respuesta

71

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

de la norma C++ 03 (23.2.4.1):

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

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

+1

Si está utilizando un proyecto de norma, o algo aún no ha ratificado y oficial, por favor, dígalo. No pude encontrar nada parecido en el estándar actual. –

+5

En el borrador de C++ 0x, es 23.2.5.1, y en C++ 03, es 23.2.4.1. La redacción no está en el estándar C++ 98. Estoy viendo ISO/IEC 14882: 2003 (E) – Eclipse

+1

Se agregó más adelante en el Corrigendum técnico. –

2

sí.

todos los días debería ser contiguos

10
+0

1 para el enlace a C++ FAQ –

+0

-1 para un enlace como una respuesta –

13

almacenamiento es siempre contigua, pero puede moverse a medida que 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.

4

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

&myVector.front(); 
27

El estándar C++ 03 agregó una fraseología para aclarar que los elementos vectoriales deben ser contiguos.

C++ 03 23.2.4 Párrafo 1 contiene el siguiente lenguaje que es no en el C++ 98 documento estándar:

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

Herb Sutter habla de este cambio en una de sus entradas de blogs, Cringe not: Vectors are guaranteed to be contiguous:

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

+0

gracias. Maldición, 2003 por esta característica muy simple. – jokoon

+0

+1: Esta es la respuesta. Solo es seguro asumirlo con implementaciones compatibles con 2003, no "siempre". –

Cuestiones relacionadas