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 laarray<T, N>almacenaNelementos de tipoT, de modo quesize() == Nes un invariante. Los elementos de unaarrayse almacenan de forma contigua , lo que significa que siaes unaarray<T, N>entonces obedece a la identidad&a[n] == &a[0] + npara todos0 <= 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 laarrayes un agregado de clase. El nombreelemsno es parte de la interfaz de laarray. "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.