Resumen
Hasta aquí cada dato del curso ha vivido en su propia variable, con su propio nombre; pero muchos datos del mismo tipo, como las temperaturas de una semana, no se pueden recorrer con un bucle si cada uno tiene un nombre distinto. Esta clase presenta la primera estructura de datos del curso, la secuencia indexada: elementos del mismo tipo, en posiciones contiguas de la memoria, numeradas desde cero. En C++ moderno se escribe con std::array, cuyo tamaño queda fijo al compilar. Se estudian su declaración, el tipo std::size_t de los índices y los dos recorridos, con índice y con el for por rango. Se establece la regla que gobierna toda la unidad: un índice es válido si está entre 0 y el tamaño menos uno, y en cada acceso de un bucle esa validez se justifica con el invariante. Se muestra qué ocurre cuando no se cumple, que es comportamiento indefinido, y se compara [] con el acceso comprobado .at(). Y se presentan los arreglos de C, para leer código ajeno.
Objetivos de aprendizaje
- Declarar, inicializar y recorrer un
std::arraycon índices y con elforpor rango. - Justificar, mediante el invariante del bucle, que un índice está dentro de los límites en cada acceso.
- Distinguir el acceso con
[], que la norma no comprueba, del acceso con.at(), que siempre se comprueba, y explicar cuándo conviene cada uno. - Leer código con arreglos de C y explicar sus desventajas frente a
std::array.
La secuencia indexada
Muchos datos, un solo nombre
Para calcular el promedio de las temperaturas de una semana con lo enseñado hasta aquí harían falta siete variables, monday, tuesday y así hasta sunday, y una suma de siete términos. Con las de un año serían 365, y ningún bucle podría recorrerlas, porque en el cuerpo de un bucle el nombre de una variable es siempre el mismo. Lo que falta es un nombre para el conjunto y un número para cada elemento, de modo que el número pueda ser una variable que el bucle hace avanzar.
Una secuencia indexada es exactamente eso: un conjunto de elementos del mismo tipo, guardados uno detrás de otro en casillas contiguas de la memoria, y designados por su posición, llamada índice. La matemática conoce el objeto: una sucesión finita , o un vector del plano, como los del curso Álgebra y Geometría I, en la que designa el elemento de lugar . En C++ se escribe a[i], y el índice puede ser cualquier expresión entera: 2, i, i + 1.
Por qué desde cero
En C++, como en la mayoría de los lenguajes actuales, el primer elemento tiene índice 0, y el último, índice . La razón no es una convención caprichosa, sino la manera en que se encuentra un elemento: si la secuencia comienza en cierta dirección de memoria y cada elemento ocupa bytes, el elemento de índice está en la dirección inicial más . El índice es, por tanto, un desplazamiento: la cantidad de elementos que hay que saltar desde el primero. El primero está a cero saltos de sí mismo.
De ello se sigue la definición que gobierna toda esta unidad: en una secuencia de elementos, un índice es válido si y solo si . La desigualdad de la derecha es estricta, y es la fuente del error más frecuente con secuencias, el error por uno: escribir donde debía escribirse , o comenzar en 1 donde debía comenzarse en 0. Un índice igual a no designa el último elemento, sino la casilla que sigue a la secuencia, que no le pertenece.
Cargando el contenido…