Disponible la versión 6 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


4.3 Matrices

§1 Sinopsis

Desde el punto de vista del programa, una matriz (array ó vector) es una zona de almacenamiento contiguo, que contiene una serie de elementos del mismo tipo, los elementos de la matriz [1]. Desde el punto de vista lógico podemos considerarlas como un conjunto de elementos ordenados en fila. Así pues, en principio todas las matrices son de una dimensión, la dimensión principal, pero veremos que los elementos de esta fila pueden ser a su vez matrices (un proceso que puede ser recursivo), lo que nos permite hablar de la existencia de matrices multi-dimensionales, aunque las más fáciles de "ver" o imaginar son las de dos y tres dimensiones.

Nota: aunque en C/C++ los conjuntos ordenados de elementos del mismo tipo se denomina matrices (arreglos), la idea aparece en otros lenguajes bajo distintos nombres. Por ejemplo, vector; lista ("list") o secuencia ("sequence"). En cualquier caso, no confundirlas (las matrices) con los conjuntos de pares nombre/valor, que existen en otros lenguajes bajo los nombres de diccionarios ("dictionarys"); tablas hash ("hash tables"); listas indexadas ("keyed lists") o matrices asociativas ("associative arrays"), pero que como tales, no existen en C++; aunque la Librería Estándar sí dispone de tales estructuras ( 5.1.1a). 

Como advertencia para los lectores que han utilizado matrices en otros lenguajes, señalar que quizás el aspecto más significativo del manejo de matrices en C++, es que el compilador desconoce su tamaño, de forma que el programador debe adoptar precauciones para no salir de sus límites, ya que el compilador permite referenciar elementos inexistentes, más allá del final de la matriz, con el consiguiente riesgo de error. En este capítulo abordaremos todo lo necesario para manejarlas en C++.

§2 Comentario

Puede afirmarse que las matrices son un recurso de programación simple y socorrido; en realidad pueden considerarse como las "estructuras" de datos ( 1.8) más simples que cabe imaginar (todos los elementos del mismo tipo). Presentan la ventaja de que sus elementos son rápidamente accesibles, en especial si utiliza punteros en vez de subíndices, pero presentan una notable limitación: son de tamaño fijo; es preciso definir su tamaño desde el principio y no pueden ser fácilmente incrementadas o disminuidas sino mediante complejos procesos de copia.

Estas estructuras de datos son adecuadas para situaciones en las que el acceso a los datos se realice de forma aleatoria e impredecible. Por el contrario, si los elementos pueden estar ordenados y se va a utilizar acceso secuencial sería más adecuado utilizar una lista ( 1.8).  

Las matrices C++ se consideran tipos complejos ( 2.2), y se alojan en zonas de memoria contiguas, aunque tendremos ocasión de ver ( 4.3.6) que C++ permite definir unas seudo-matrices que en realidad no se almacenan de esta forma. Los programadores que hayan utilizado lenguajes con matrices dinámicas (incluso multi-dimensionales), sentirán una especial frustración con las limitaciones de las matrices C++. Sin embargo, el C++ Estándar ofrece en su Librería ( 5) alternativas interesantes a las matrices; en especial las clases vectorstring (adaptada al manejo de cadenas de caracteres), list, deque y valarray. Esta última especialmente optimizada para el manejo de matrices numéricas.

Antes de abordar cualquier proyecto medianamente importante en el que se requiera el uso intensivo de matrices, aconsejamos vivamente evaluar las posibilidades que ofrecen al respecto las estructuras de la Librería Estándar, en especial si se trata de matrices cuyo tamaño deba cambiar, o no pueda ser conocido en tiempo de compilación.

  Inicio.


[1] De un tiempo a esta parte, quizás desde que presto atención al tema, encuentro que prácticamente todos los libros de informática que consulto, hablan de "arreglos" cuando se refieren a "arrays". Incluyendo no solo los traducidos del inglés (caso muy frecuente). También los escritos originariamente en español, incluyendo los de escritores supuestamente españoles (profesores de alguna Universidad española). La verdad es que no entiendo muy bien el porqué. Aunque los anglosajones han utilizado siempre "arrays" para este significado, no es menos verdad que los españoles hemos utilizado siempre "matrices" para referirnos a ellas, tanto en obras propias como en traducciones. Como todavía no he tirado los libros, puedo poneros algunos ejemplos: "Álgebra Moderna" de A. Lentin y J. Rivadud. Versión Española Editorial Aguilar 1967 (es una traducción del original francés). "Mecánica Racional" Carlos Mataix (este si es español: Catedrático de la Escuela Técnica Superior de Ingenieros Industriales de Madrid). "Programación Lineal" Robert W. Llewellyn (traducción del original inglés). Edit. Marcombo S.A. 1968. Alguno puede argumentarme que son algo antiguos, y que el lenguaje ha cambiado desde entonces. La verdad es que respeto cualquier opinión sensata, pero no creo que haya cambiado tanto (de ser así no me entendería con mis compatriotas). Sospecho que tal vez sea una peculiaridad del español de América, y que los editores obliguen a los autores a utilizar determinadas formas de lenguaje con el fin de que sus libros tengan un mercado más amplio; aunque también pudiera ser el resultado de esa estúpida moda de lo "Políticamente correcto" que obliga a llamar "morenos" a los negros. Sea cual sea la razón, permitidme que siga refiriéndome a los "arrays" como "matrices" (así me lo enseñaron).  Decir otra cosa me costaría tanto trabajo como llamar guagua al autobús.