sábado, 28 de noviembre de 2015

STL de C++

Si sos programador c++, seguro que no te cuento nada nuevo, pero si empesas tenes que saber que son las STL.

Antes que nada STL utiliza templates, si no sabes que es template de c++, busca un rato y luego volve.

La STL (del inglés Standard Template Library) es una biblioteca de clases y funciones templates creada para estandarizar y optimizar la utilización de algoritmos y estructuras de datos en el desarrollo de software en C++. La adopción de esta biblioteca posee grandes ventajas: al ser estándar está disponible en todos los compiladores y plataformas; está libre de errores, por lo tanto se ahorrará tiempo en depurar el código; proporciona su propia gestión de memoria. En este capítulo se presenta una descripción de los componentes más importantes de la STL junto con una gama de ejemplos que
permitirán visualizar su funcionamiento y la conexión que existe entre ellos.

El diseño de la Standard Template Library es el resultado de varios años de investigación dirigidos por Alexander Stepanov y Meng Lee de HewlettPackard, y David Musser del Rensselaer Polytechnic Institute. Su desarrollo se inspiró en otras librerías orientadas a objetos y en la experiencia de sus
creadores en lenguajes de programación imperativos y funcionales, tales como Ada y Scheme.

La biblioteca presenta tres componentes básicos: contenedores, iteradores y algoritmos. Los contenedores son los objetos capaces de almacenar otros objetos, cada uno de una forma particular. Representan a las estructuras de datos más comúnmente utilizadas, como ser los arreglos lineales o las listas enlazadas. Además éstos presentan otras características adicionales que los hacen más potentes. Por ejemplo: pueden aumentar el número de elementos que almacenan; al ser templates, pueden alojar cualquier tipo de dato o clase; casi todos los contenedores proveen iteradores (herramientas para poder acceder a sus elementos), lo que hace que los algoritmos que se aplican
a ellos sean más eficientes. Los iteradores son objetos a través de los cuales se puede acceder a los elementos del contenedor. El concepto de iterador es similar al de un puntero, sólo que al ser una clase provee mayores utilidades que éste. Pero la gran utilidad de los iteradores ocurre por el uso que de ellos hacen los algoritmos. En la biblioteca existen más de setenta algoritmos para aplicar sobre los contenedores a través de los iteradores. Hay algoritmos de búsqueda, de ordenamiento, de transformación, matemáticos, etc.

Contenedores

Son una colección de las estructuras de datos más populares utilizadas habitualmente. Un contenedor es justamente eso: un lugar en donde contener o agrupar objetos del mismo tipo. La diferencia entre un contenedor y otro está en la forma en que los objetos son alojados, en cómo se crea la
secuencia de elementos y la manera en que los podrá acceder a cada uno de ellos. Éstos pueden estar almacenados en forma contigua en la memoria o enlazados a través de punteros. Esto hace que las estructuras difieran también en la forma en que se accede a los elementos, la velocidad con la
cual se insertan o se eliminan estos y en la eficiencia de los algoritmos que se apliquen a ellas.

Éstos se dividen en contenedores de secuencia o lineales y contenedores asociativos. Los de secuencia son vector, list y deque. Los asociativos son set, multiset, map y multimap. En esta sección se describirán las operaciones comunes de los contenedores y las estructuras de secuencia solamente. Las asociativas se postergarán para luego de haber visto iteradores y algoritmos.

Operaciones comunes

Antes de realizar cualquier operación con un contenedor hay que crearlo. La sintaxis utilizada para ello es la siguiente:

X < T > instancia;

Donde X representa el tipo de contenedor que se quiere utilizar y T el tipo de dato de los elementos que almacenará la estructura. Así, por ejemplo, para crear un vector de enteros llamado “valores” se escribe:

vector <int> valores;
Obsérvese que tanto vector como los demás contenedores son clases template. Por lo tanto, al hablar de clases, hablamos también de constructores. En la notación previa invocamos al constructor “vacío”, es decir, sin parámetros. Esto hace que se cree un contenedor en memoria pero que no contiene aún ningún elemento. Esta es la sintaxis que se utilizará más a menudo, sin embargo, existirán ocasiones en que se necesite crear estructuras auxiliares que sean copias de otras preexistentes.

vector < int > aux (valores);

Aquí, “aux” es un vector de enteros y, además, es una copia exacta de “valores”. En esta ocasión se utiliza el constructor de “copia”. También es posible obtener el mismo resultado empleando el operador de asignación “=”, como se sigue;

vector < int > aux;
aux = valores;

Además de los constructores, los contenedores tienen una serie de operaciones que son comunes a todos ellos. Por otra parte existen funciones que se aplican sólo a contenedores lineales.

Hasta aquí las generalidades de STL, en un próximo post voy a ver las estructuras más usadas.

Dejo link: https://es.wikipedia.org/wiki/Standard_Template_Library