tipos listas estructura enlazadas ejemplos datos caracteristicas c++ arrays pointers c++11 contiguous

c++ - listas - ¿La memoria en std:: array es contigua?



listas enlazadas ejemplos (2)

¿La memoria en std::array contigua? ¿Es válido lo siguiente / buena práctica?

std::array<type1,Num> arr = //initialize value type1 * ptr = &arr[0];

¿Podría entonces pasar ptr a las funciones que esperan una matriz de estilo c?


Sí, es contiguo, ya que es básicamente (y en realidad) un type arr[10]; , pero con STL como interfaz. Tampoco se descompone a un puntero en la menor provocación.

Puede pasar con seguridad &arr[0] a una función que espera una matriz de estilo C, ese es el objetivo de diseño de la misma. Para usarlo con los algoritmos STL, sin embargo, solo use las funciones de begin y end :

// either members std::sort(arr.begin(), arr.end()); // or free from <iterator> std::sort(std::begin(arr), std::end(arr));

Para la parte del abogado de idioma, §23.3.2.1 [array.overview] p1 :

El encabezado <array> define una plantilla de clase para almacenar secuencias de objetos de tamaño fijo. Una matriz admite iteradores de acceso aleatorio. Una instancia de la array<T, N> almacena N elementos de tipo T , de modo que size() == N es un invariante. Los elementos de una array se almacenan de forma contigua , lo que significa que si a es una array<T, N> entonces obedece a la identidad &a[n] == &a[0] + n para todos 0 <= n < N .

Y §23.3.2.1 [array.overview] p2 :

Una matriz es un agregado (8.5.1) que se puede inicializar con la sintaxis

  • array<T, N> a = { initializer-list };

También, en p3 , listando los miembros de std::array :

T elems[N]; // exposition only
[ Nota: los elementos de la variable miembro se muestran solo para la exposición, para enfatizar que la array es un agregado de clase. El nombre elems no es parte de la interfaz de la array . "Nota final "


Sí, la memoria de std::array es contigua. En VC10, se declara como:

template<class _Ty, size_t _Size> class array { // fixed size array of values ... _Ty _Elems[_Size == 0 ? 1 : _Size]; };

Donde _Elemes no es más que una simple matriz del tipo dado.