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>
almacenaN
elementos de tipoT
, de modo quesize() == N
es un invariante. Los elementos de unaarray
se almacenan de forma contigua , lo que significa que sia
es unaarray<T, N>
entonces obedece a la identidad&a[n] == &a[0] + n
para 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 laarray
es un agregado de clase. El nombreelems
no 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.