STL: Standard Template Library Estructuras de Datos Andrea Rueda Pontificia Universidad Javeriana Departamento de Ingeniería de Sistemas STL Standard Template Library STL (Standard Template Library) ● ● ● ¡Librería con “muchas cosas” genéricas! Provee un conjunto de clases comunes, usables con cualquier tipo de dato y con operaciones elementales. Tres componentes: ● Contenedores (containers). ● Algoritmos (algorithms). ● Iteradores (iterators). www.bogotobogo.com/cplu splus/stl_vector_list.php http://www.sgi.com/tech/stl STL (Standard Template Library) Componentes: ● ● ● Contenedores: clases predefinidas para almacenamiento de datos. Algoritmos: operaciones básicas como búsqueda y ordenamiento. Iteradores: permiten recorrer los datos en los contenedores (similar a apuntadores). http://www.sgi.com/tech/stl STL (Standard Template Library) ¿Cómo se conectan estos conceptos? www.bogotobogo.com/cplusplus/stl3_iterators.php http://www.sgi.com/tech/stl Contenedores STL ● Contenedores secuenciales estándar: ● De acceso aleatorio: - vector: Arreglos dinámicos. (std::vector ↔ #include <vector>) - deque: Cola de doble cabeza, inserción/eliminación en cabeza y cola. (std::deque ↔ #include <deque>) ● De acceso iterativo: - list: Doblemente encadenada. (std::list ↔ #include <list>) Contenedores STL ● Contenedores como interfaz (container adaptors): - queue: cola, primero que entra, primero que sale. (std::queue ↔ #include <queue>) - stack: pila, último que entra, primero que sale. (std::stack ↔ #include <stack>) - priority_queue: cola de prioridad. (std::priority_queue ↔ #include <queue>) Contenedores STL ● Contenedores asociativos: - set: conjunto matemático, operaciones de unión, intersección, diferencia; requiere función de comparación. (std::set ↔ #include <set>) - map: arreglo asociativo, provee mapeo de un dato (clave) a otro (valor); requiere función de comparación para la clave. (std::map ↔ #include <map>) Iteradores STL ● Objeto que puede iterar entre un rango de elementos predefinido a través de operadores: – Input iterator : extrae datos, movimiento hacia adelante. – Output iterator : almacena datos, movimiento hacia adelante. – Forward iterator : almacena y extrae datos, movimiento hacia adelante. – Bidirectional iterator : almacena y extrae datos, movimiento hacia adelante y hacia atrás. – Random-access iterator : almacena y extrae datos, acceso a elementos en cualquier orden. Iteradores STL ● Operaciones: - Operador *: (dereferenciación) funciona como un apuntador, retorna el contenido del iterador. - Operadores ++ y ­­: mueve el iterador a la siguiente posición o a la anterior posición. - Operadores == y !=: comparación de iteradores, si apuntan o no al mismo elemento. - Operador =: asigna una nueva posición al iterador (usualmente principio o fin del contenedor). Iteradores STL Operaciones * * = ++ ­­ == , != = Input iterator ✔ ✘ ✔ ✘ ✔ ✔ Output iterator ✘ ✔ ✔ ✘ ✘ ✔ Forward iterator ✔ ✔ ✔ ✘ ✔ ✔ Bidirectional iterator ✔ ✔ ✔ ✔ ✔ ✔ Randomaccess iterator * ✔ ✔ ✔ ✔ ✔ ✔ * además soporta operaciones de acceso aleatorio: +n, ­n, <, >, <=, >=, +=, ­=, [] Contenedores e Iteradores STL ● Cada contenedor incluye funciones básicas para usar con el operador = – begin(): iterador que representa el inicio de los elementos. – end(): iterador que representa el elemento después del final. – cbegin(): iterador constante (sólo lectura) que representa el inicio de los elementos. – cend(): iterador constante (sólo lectura) que representa el elemento después del final. Contenedores e Iteradores STL ● Cada contenedor incluye funciones básicas para usar con el operador = – rbegin(): representa el inicio en la secuencia inversa. – rend(): representa el elemento después del final en la secuencia inversa. – crbegin(): iterador constante, representa el inicio en la secuencia inversa. – crend(): iterador constante, representa el elemento después del final en la secuencia inversa. Contenedores e Iteradores STL ● Cada contenedor tiene varios tipos de iteradores: – – – – container::iterator iterador de lectura/escritura (entrada/salida). container::const_iterator iterador de sólo lectura (entrada). container::reverse_iterator iterador en secuencia inversa de lectura/escritura (entrada/salida). container::const_reverse_iterator iterador en secuencia inversa de sólo lectura (entrada). Iteradores inválidos ● Después de algunas operaciones en los contenedores, los iteradores pueden resultar inválidos: * Cambiar el tamaño o la capacidad. * Algunas inserciones y/o eliminaciones: – Iteradores singulares: sin asociar a un contenedor. – Iteradores después del final. – Iteradores fuera de rango. – Iterador colgante: apunta a un elemento no existente, en otra ubicación o no accesible. – Iteradores inconsistentes. Ejercicios Ejercicio 1 ● (Individual) en un archivo de código fuente: – Declarar un vector, una deque y una list. – Rellenar cada uno con 50 números aleatorios (diferentes en cada estructura): ● ● vector sólo por el final. deque y list por ambos extremos (uno al inicio, otro al final). – Recorrer e imprimir cada una en orden y en orden inverso. – En cada una, insertar un nuevo valor en una posición aleatoria, y eliminar dos valores en posiciones aleatorias, volver a imprimir en orden. Referencias ● www.sgi.com/tech/stl ● www.cplusplus.com ● ● ● ● http://www.learncpp.com/cpp-programming/16-3stl-iterators-overview/ http://www.cs.northwestern.edu/~riesbeck/progra mming/c++/stl-iterators.html http://www.cprogramming.com/tutorial/stl/iterators .html http://www.angelikalanger.com/Conferences/Slid es/CppInvalidIterators-DevConnections-2002.pdf