Tecnología de la Programación Javier Nieves Acedo Standar Template Library (STL)

Slides:



Advertisements
Presentaciones similares
Arreglos Unidimensionales y Bidimensionales ESTRUCTURAS DE DATOS I
Advertisements

IBD Curso 2007 Clase 2.
IBD Plan 90 y 2003 Clase 10.
Método de ordenación por inserción
FACHADA COMPOSITOR MEMENTO
IBD Clase 7.
Relacionando Datos Arrays
Informática Aplicada a la Gestión de Empresas (IAGE) Parte III Excel e Internet Tema 2.
PROGRAMACIÓN PARALELA Tema 5: Análisis de algoritmos paralelos
INTRODUCCIÓN A JAVA.
Unidad 5 Listas Enlazadas Bibliografía: Algoritmos y Estructuras de datos de Aguilar y Martinez. Unidad 9 Autor: Ing Rolando Simon Titiosky.
Desarrollo y Características de Documentos Electrónicos
Estructuras de Datos (ARRAYS)
Programación I Teoría III
Direcciones, Arreglos y Argumentos de Funciones
Las estructuras de arreglos fueron usadas en las primeras computadoras digitales, cuando la programación se hacía todavía en lenguaje máquina, para tablas.
Curso de Programación 1 Plan 97
Capitulo 3 Java util.
MANEJO DE ARRAYS EN C.
INFORMATICA I Arreglos 1 CLASE 17.
INFORMATICA I Arreglos 2 CLASE 18.
PROGRAMACION DE Pilas o Stacks y Colas
Ingeniería del Software
Teoría de lenguajes y compiladores
Arreglos Ing. Nahiby Castillo.
PROGRAMACIÓN ORIENTADA A OBJETOS
Marzo 2007 Lenguajes Visuales Clase III.
Estructuras de Datos Especificación formal de Listas.
Colas y Listas Enlazadas
Herramientas para el acceso directo a memoria en C++
¿Qué es un PUNTERO?: Un puntero es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable. No.
Vectores en java.
Manipulación de caracteres e hileras de texto
Abstracción de los datos y Orientación a Objeto Clase 13.
Introducción a los Conceptos de Bases de Datos Docente: Ing. Marleny Soria Medina.
COLAS, IMPLEMENTACIÓN A PARTIR DE LISTAS Y PARA PILAS
Ordenación, Clasificación
 2003 Prentice Hall, Inc. All rights reserved. 1 Capítulo 6: Clases y Abstracción de Datos Índice del capítulo 6.1 Introducción 6.2 Estructuras 6.3 Clases.
Matrices Es una estructura homogénea, compuesta por varios elementos, todos del mismo tipo y almacenados consecutivamente en memoria A cada elemento se.
UNIDAD 2:Crear, abrir y cerrar una base de datos Hacer clic sobre la opción Nuevo de la pestaña Archivo. Se mostrarán las distintas opciones para nuevos.
ESTRUCTURAS DE DATOS I Conocer, comprender y analizar algunos de los principales tipos de estructuras de datos.
Vectors (Vectores) Agustin J. González ELO329. Contenidos Qué es un vector? Declaración de Objetos Vectores Inserción y eliminación de items Uso de sub-índices.
Estructura de Datos y Algoritmos
Clase 10: Estructuras de datos y arreglos.
ELO3201 Contenedores Biblioteca Estándar de Templates Agustín J. González ELO320 Contenido Contenedores: Vector, List, Deque, Stack, Queue, Priority Queue,
Aplicación de estructuras de datos
Clasificación de los TDA
Manejo de Punteros y objetos en memoria dinámica en C++
Programación Orientada Objetos
Patrones de Diseño Carolina Perozo Julio Padrón Anthony Accardi.
Informática Ingeniería en Electrónica y Automática Industrial
Laboratorio Análisis y Diseño de Algoritmos 2 Biblioteca estándar de templates de C++ Standard Template Library (STL)‏ Motivación Ejemplo: Lista + Iterador.
Programación en C para electrónicos
Patrón Iterator Santiago García Sánchez Rebeca Marcos Salcedo Mª Cristina Zapatero Gironda.
Punteros Recomendado: 1. Nivelación Funciones
Objetivo Mostrar los fundamentos de la programación a través de ejemplos y prácticas utilizadas cotidianamente en el desarrollo de aplicaciones.
Son estructuras de datos que almacenan y recuperan sus elementos atendiendo a un estricto orden (LIFO Last – in, first –out Ultimo en entrar – primero.
1 Asignación Dinámica de Memoria Agustín J. González ELO 329.
Sistemas de Archivos Sistemas Operativos.  Se debe proporcionar un almacenamiento secundario que respalda a la memoria principal  El Sistema de archivos.
INSTITUTO TECNOLOGICO DE APIZACO
Arrays multidimensionales en JAVA
Estructura de Datos..
MEMORIA DINÁMICA.
1 ListaUna Lista se define como una serie de N elementos E 1, E 2,..., E N, ordenados de manera consecutiva, es decir, el elemento E k (que se denomina.
GENERICIDAD Es una propiedad que permite definir una clase o función sin especificar el tipo de datos de uno o mas de sus parámetros (Módulos Parametrizados).
Vectors (Vectores)‏ e Iteradores
Vectors (Vectores)‏ Agustín J. González ELO329.
Vectors (Vectores)‏ e Iteradores
Vectors (Vectores)‏ Agustín J. González ELO329.
Vectors (Vectores)‏ Agustín J. González ELO329.
Transcripción de la presentación:

Tecnología de la Programación Javier Nieves Acedo Standar Template Library (STL)

¿ Qué es la Standard Template Library?

Como su nombre indica, es una librería…

… de contenedores…

… que nos va a permitir NO programar más un contenedor…

… pero hay que aprender a utilizar sus funciones…

… y va a ser muy fácil …

… y para comenzar …

… una vista general …

Visión General (1) Alexander Stepanov Los algoritmos de las estructuras de datos son bastante independientes de la implementación concreta. Desarrolla una biblioteca de clases contenedoras genérica para ADA (1985) Desarrolla una similar para C++, la Standar Template Library - STL (1993) En 1994 es adoptada como estándar ANSI/ISO C++

Visión General (2) STL Biblioteca de propósito general de estructuras de datos y algoritmos para gestionarlas. Permite escribir código más rápido y menos líneas No hay que diseñar estructuras de datos

Visión General (3) STL - Conocimientos previos Clases Sobrecarga de operadores Plantillas de clases Plantillas de funciones

Visión General (4) STL - Cinco componentes Contenedor Algoritmo genérico Iterador Funciones y Funciones Objeto Adaptador

Visión General (5) STL – Contendor (1) Objeto que contiene otros objetos Los contenedores se diferencian por la forma en la que se colocan los datos en ellos Los adaptadores son contenedores especiales Permiten obtener nuevos tipos de contenedores a partir de los ya existentes

Visión General (6) STL – Contendor (2)

Visión General (7) STL – Contendor (3)

Visión General (8) STL – Contendor (4) Los contenedores de la STL pueden contener tipos básicos, tipos definidos por el usuario o apuntadores a ambos En caso de trabajar con apuntadores es responsabilidad del programador gestionar la memoria de esos apuntadores

Visión General (9) STL – Contendor (5) Hay contenedores que no han sido desarrollados pero se pueden obtener de otra forma El árbol no existe pero el Set está implementado como un árbol. Los arrays multidimensionales no están implementados ¿Cómo los hacemos?

Visión General (10) STL – Contendor (y 6) Los contenedores son plantillas de clases y tienen constructores sobrecargados, operadores, métodos… Ejemplos: size(), begin(), end(), empty(), erase() …

Visión General (11) STL – Iteradores (1) Generalización de los punteros para permitir al programador trabajar con todos los contenedores de una manera homogénea Son punteros encapsulados en una clase Suelen usarse para desplazarse por el contendor

Visión General (12) STL – Iteradores (2) Categorías

Visión General (13) STL – Iteradores (3) InputIterator: Iterador de lectura que se mueve solamente hacia adelante. Es el más simple. Puede ser incrementado (++) para que apunte al siguiente elemento del contenedor y solo permite algoritmos de una sola pasada ya que no dispone del decremento (--). Solo lee. OutputIterator: Iterador de escritura que se mueve solamente hacia delante. Como el anterior, salvo que se utiliza para escribir.

Visión General (14) STL – Iteradores (4) ForwardIterator: Iterador de lectura/escritura que se mueve hacia adelante. Una sola pasada pero incorporando simultáneamente las funcionalidades de los dos anteriores. BidirectionalIterator: Iterador de lectura/escritura moviéndose hacia delante y hacia atrás. Más potente que los anteriores, permite no solo incrementar sino también decrementar por lo que puede avanzar y retroceder sobre los elementos del contenedor.

Visión General (15) STL – Iteradores (5) RandomAccessIterator: Iterador de lectura/escritura de acceso aleatorio. Es el más potente de todos al permitir una aritmética de punteros completa tal como avanzar o retroceder un desplazamiento cualquiera, restar dos iteradores o encontrar el número de objetos que los separan. Estas categorías son jerárquicas (ver el gráfico anterior)

Visión General (16) STL – Iteradores (y 6) Iteradores constantes no permiten modificar valores y los mutables si que lo permiten Iteradores especiales: begin - al llamar a begin() end – al llamar a end() En muchos algoritmos es necesario delimitar el principio y el final y se hará mediante iteradores

Visión General (17) STL – Algoritmos Genéricos (1) A parte de los métodos los algoritmos genéricos y los iteradores permiten gestionar los objetos. La STL proporciona una amplia colección de algoritmos pero pueden ser ampliados por el programador

Visión General (18) STL – Algoritmos Genéricos (y 2)

Visión General (19) STL – Funciones (1) Muchos de los algoritmos necesitan funciones que son aplicadas a los contenedores por medio de iteradores. Pueden ser pasadas como Apuntadores a funciones Sobrecarga del operador () - Función objeto Hay varias situaciones que son mejores las funciones objetos

Ahora veremos cada contenedor …

Vector & Vector (1) La clase vector generaliza el concepto de array de C. Es una estructura de datos indexada de 0 hasta el número de elementos contenidos menos uno. Los valores se asignan y extraen con el operador []

Vector & Vector (2) Diferencias con el array: Más autoconocimiento, se le puede preguntar por su tamaño, el número de elementos que puede almacenar, etc. El tamaño del vector puede cambiar de forma dinámica. Se puede insertar al final o en medio. Pero la inserción en medio no es tan buena como en una lista (tenerlo en cuenta a la hora de seleccionar contenedores).

Vector & Vector (3) Siempre que se use vector: #include Y la definición de un iterador vector ::iterator iterVectorInt; Además incluye la definición de varios tipos que se utilizarán en sus métodos

Vector & Vector (4)

Vector & Vector (5) Resumen de métodos (1) MétodoExplicación vector(size_type n) Constuye un vector para n objetos. vector(size_type n, T& t) Construye un vector con n copias de tipos t. vector(vector&) Constructor copy. Construye un vector a partir de otro. vector(iterator, iterator) Construye un vector copiando un rango de otro contenedor.

Vector & Vector (6) Resumen de métodos (2) MétodoExplicación ~vector() Destructor. iterator begin() Devuelve un iterator que apunta al primer objeto del vector. iterator end() Devuelve un iterator que apunta al final del vector. size_type size() Devuelve el tamaño actual del vector.

Vector & Vector (7) Resumen de métodos (3) MétodoExplicación size_type max_size() Devuelve el mayor tamaño posible de vector. size_type capacity() Devuelve el número de objetos actualmente reservados en memoria. capacity() es siempre mayor o igual que size(). void reserve(size_type n) Petición de memoria adicional. Si n es menor o igual que capacity(), no hace nada. Si la petición ha ido bien, capacity() es mayor o igual a n, si no ha ido bien no cambia. En cualquier caso size() no cambia.

Vector & Vector (8) Resumen de métodos (4) MétodoExplicación bool empty() true si el tamaño del vector es 0. reference front() Devuelve el primer objeto del vector. reference back() Devuelve el último objeto del vector. void pop_back() Elimina el último objeto.

Vector & Vector (9) Resumen de métodos (5) MétodoExplicación void swap(vector&) Intercambia los contenidos de dos vectores void push_back(T&) Inserta un nuevo objeto al final. iterator insert(iterator pos, T& x) Inserta x delante de pos. void insert(iterator pos, iterator first, iterator last) Inserta el rango [first, last) delante de pos

Vector & Vector (10) Resumen de métodos (6) MétodoExplicación void insert(iterator pos, size_type n, T& x) Inserta n copias de x delante pos. iterator erase(iterator pos) Elimina el objeto situado en la posición pos. iterator erase(iterator first, iterator last) Elimina el rango delimitado por [first, last) void clear() Elimina todos los objetos del contenedor.

Vector & Vector (11) Resumen de métodos (y 7) MétodoExplicación reference operator[](size_type n) Sobrecarga de []. Devuelve the n-ésimo objeto. vector& operator=(vector&) Sobrecarga = de la asignación. bool operator==(vector&, vector&) Sobrecarga de == de dos vectores. bool operator<(vector&, vector&) Sobrecarga de < por comparación lexicográfica

Vector & Vector (12) Declaración e inicialización (1) // Indicando el tamaño vector vectorUno(10); //Inicialización por asignación vector vectorDos(5, 3); // Sin elementos, ya crecerán vector vectorTres; // Constructor copia vector vectorCuatro(vectorDos); // De una sección de otro contenedor vector vector5(aList.begin(), aList.end());

Vector & Vector (13) Declaración e inicialización (y 2) La función assign() es similar a una asignación pero más versátil // Asignación por iteradores vectorSeis.assign(listaDiez.begin(), listaDiez.end()); // tres con valor 7 vectorCuatro.assign(3,7); // doce con valor cero vector5.assign(12);

Vector & Vector (15) Indexación de Vectores Operador [], o la función at() cout << vector5[1] << endl; vector5[1] = 17; La función front() y back() devuelven los valores primero y último respectivamente

Vector & Vector (16) Inserción y Eliminación de Elementos Utilizando métodos como push_back() o pop_back() (Óptimo) Utilizando métodos como insert() o erase() (No Óptimo) Si se hace un reasignación de memoria por causa de una inserción quedan invalidados todas las referencias, punteros e iteradores que señalasen a algo intermedio del contenedor

Vector & Vector (17) Iteración Los métodos begin() y end() devuelven iteradores de acceso aleatorio Los métodos rbegin() y rend() devuelven iteradores similares pero para el acceso en orden inverso Si el contenedor es declarado como constante, o el destino o el parámetro lo son; los iteradores son constantes

Vector & Vector (18) Comprobación de Inclusión No hay método que permita verificarlo Se pueden aplicar algoritmos genéricos como find() o count() // Comprobación de si está el número 17 int num = 0; count(vector5.begin(), vector5.end(), 17, num) if (num) cout « "contiene 17" « endl; else cout « "no contiene un 17" « endl;

Vector & Vector (19) Operaciones de Ordenación Puede ser ordenador mediante el algoritmo genérico sort() // ordena ascendente sort (aVec.begin(), aVec.end()); // ordena descendente sort (aVec.rbegin(), aVec.rend());

Vector & Vector (20) Algoritmos genéricos útiles (1)

Vector & Vector (21) Algoritmos genéricos útiles (2)

Vector & Vector (22) Algoritmos genéricos útiles (y 3)

Vector & Vector (y 23) Vectores Booleanos Este tipo de vectores los maneja de forma especial Su implementación es más eficiente Se añade la función flip() invierte los bits vector vbits(27); vbits.flip(); vbits[17].flip();

List (1) La estructura vector es para tamaños relativamente fijos, porque las ampliaciones son más costosas que con otros tipos de estructuras Alternativa  List Almacenamiento secuencial de información (no necesariamente ordenada)

List (2) Permite añadir al principio, al final y en medio. En todos los casos las inserciones son eficientes. Incluir en el fichero la cabecera #include

List (3) Y la definición de un iterador list ::iterator iterListInt; Además incluye la definición de varios tipos que se utilizarán en sus métodos

List (4) Resumen de métodos (1) MétodoExplicación list() Construye una list vacía. list(size_type n) Construye una list de n objetos. list(size_type n, T& t) Construye una list con n copias del objeto t. list(list&) Constructor copy.

List (5) Resumen de métodos (2) MétodoExplicación list(InputIterat f, InputIterat l) Contruye una list a partir de un rango de otro contenedor. ~list() Destructor iterator begin() Devuelve un iterator apuntando al comienzo list. iterator end() Devuelve un iterator apuntando al final de list.

List (6) Resumen de métodos (3) MétodoExplicación size_type size() Devuelve el tamaño de list. size_type max_size() Devuelve el mayor tamaño posible de list. bool empty() true si el tamaño de list es 0. reference front() Devuelve el primer objeto.

List (7) Resumen de métodos (4) MétodoExplicación reference back() Devuelve el último objeto. void push_front(T&) Inserta un nuevo objeto al comienzo. void push_back(T&) Inserta un nuevo objeto al final. iterator insert(iterator pos, T& x) Inserta el objeto x delante de pos.

List (8) Resumen de métodos (4) MétodoExplicación void insert(iterator pos, iterator f, iterator l) Inserta el rango [f, l) delante de pos. void insert(iterator pos, size_type n, T& x) Inserta n copias de x delante de pos. void pop_front() Elimina el primer objeto. void pop_back() Elimina el último objeto.

List (9) Resumen de métodos (6) MétodoExplicación iterator erase(iterator pos) Elimina el objeto situado en la posición pos. iterator erase(iterator first, iterator last) Elimina los objetos del rango [first, last) void clear() Elimina todos los objetos. void remove(T& value) Elimina los objetos que coinciden con value.

List (10) Resumen de métodos (7) MétodoExplicación void splice(iterator pos, list& L) Todos los objetos de L son insertados antes de pos y eliminados de L. void splice(iterator pos, list& L, iterator i) Inserta el objeto de L apuntado por i delante de pos, eliminadolo de L. void splice(iterator pos, list& L, iterator f, iterator l) Mueve los objetos del rango [f,l) desde L a *this, insertándolos delante de pos. void unique() De cada grupo de objetos consecutivos iguales, elimina todos menos el primero.

List (11) Resumen de métodos (8) MétodoExplicación void swap(list& L) Intercambia los contenidos de dos list. void merge(list& L) Elimina los objetos de L y los inserta ordenados en *this. (*this y L deben estar ordenados de acuerdo a operator< y además &L != this). void reverse() Invierte todos los objetos de L. void sort() Ordena *this de acuerdo con operator<.

List (12) Resumen de métodos (9) MétodoExplicación list& operator=(list&) Sobrecarga de la asignación = bool operator==(list&, list&) Sobrecarga ==. bool operator<(list&, list&) Sobrecarga de <.

List (13) Declaración e inicialización (1) // Indicando el tipo pero no tamaño list list1; list list2; list list3; // cinco elementos, inicializados a cero list list4(5); // 4 valores, inicialmente 3.14 list list5(4, 3.14); // constructor por defecto, 4 elementos list list6(4);

List (14) Declaración e inicialización (2) // Indicando el tipo pero no tamaño list list1; list list2; list list3; // cinco elementos, inicializados a cero list list4(5); // 4 valores, inicialmente 3.14 list list5(4, 3.14); // constructor por defecto, 4 elementos list list6(4);

List (15) Declaración e inicialización (3) // Constructor copy list list10(list9); // Valores copiados por asignación list list11; list11 = list6;

List (16) Declaración e inicialización (y 3) La función assign() es similar a una asignación pero más versátil // Asignación por iteradores list6.assign(list10.begin(), list10.end()); // 3 copias de valor 7 líst4.assign(3, 7); // 12 copias de valor 0 list5.assign(12);

List (17) Inserción y Eliminación de Elementos (1) Utilizando métodos como push_back(), push_front o pop_back(), pop_front() Utilizando métodos como insert() o erase() (Ahora si son óptimos) Los métodos front() o back() no eliminan los objetos de esas posiciones

List (18) Inserción y Eliminación de Elementos (2) Ejemplo de eliminación // borra todos los cuatros list9.remove(4); //elimina cualquier divisible por 3 list9.remove_if(DivisiblePorTres); // lo siguiente es equivalente list ::iterator posicion3 = find_if(list9.begin(), list9.end(), DivisiblePorTres); list9.erase(posicion3, list9.end());

List (19) Inserción y Eliminación de Elementos (3) Unión de listas // une el último elemento de list10 list9.splice(posicion, list10, list10.end()); // une toda la list10 list9.splice (posicion, list10); // une list9 a list10 list10.splice(list10.begin(), list9, list9.begin(), posicion);

List (20) Inserción y Eliminación de Elementos (y 4) Invalidación de iteradores: Al contrario que en un vector o en un deque, las inserciones o eliminaciones en medio de un list no invalidarán referencias o punteros a otros elementos del contenedor.

List (21) Acceso e Iteración Con front() y back() se accede al primer y último elemento si borrarlos. Se pueden obtener dos tipos de iteradores begin(), end() o rbegin() o rend()

List (22) Comprobación de Inclusión (1) No tienen ningún método para hacerlo. Se pueden utilizar los algoritmos genéricos como find() o count()

List (23) Comprobación de Inclusión (y 2) int num = 0; count(list5.begin(), list5.end(), 17, num); if (num > 0) cout << ”si contiene un 17" << endl; else cout << "no contiene un 17" << endl; if (find(list5.begin(), list5.end(), 17) != list5.end()) cout << “si contiene un 17" << endl; else cout << "no contiene un 17" << endl;

List (24) Operaciones de Ordenación Función sort(), ordena en orden ascendente (<). Pero se puede pasar una función. // Ordena de menor a mayor list10.sort(); // ordena con una función list20.sort(ComparaObjetos);

List (25) Funciones de Búsqueda Se aplican algoritmos genéricos tales como find(), find_if(), adjacent_find(), mismatch(), max_element(), min_element() o search(). Todos dan como resultado un iterador, y si no encuentran nada el iterador al final de la lista

List (y 26) Otras operaciones El algoritmo for_each() aplica una función a todos los elementos.

Deque (1) Unión de las capacidades de la clase vector y lista: Es una colección indexada (acceder a través de la posición), algo que no tiene list. Se pueden añadir elementos de forma óptima al principio y al final (algo que no tiene vector y si list). Se pueden ser inserciones en medio, no tan eficientes como en list pero si más que en vector

Deque (2) Incluir en el fichero la cabecera #include Y la definición de un iterador deque ::iterator iterDeqInt;

Deque (2) Además incluye la definición de varios tipos que se utilizarán en sus métodos

Deque (3) Resumen de métodos (1) MétodoExplicación deque() Construye un deque vacío. deque(size_type n) Construye un deque de n objetos. deque(size_type n, T& t) Construye un deque con n copias del objeto t. deque(deque&) Constructor copy.

Deque (4) Resumen de métodos (2) MétodoExplicación deque(InputIterat f, InputIterat l) Contruye un deque a partir de un rango de otro contenedor. ~deque() Destructor iterator begin() Devuelve un iterator apuntando al comienzo list. iterator end() Devuelve un iterator apuntando al final de list.

Deque (5) Resumen de métodos (3) MétodoExplicación size_type size() Devuelve el tamaño del deque. size_type max_size() Devuelve el mayor tamaño posible del deque. bool empty() true si el tamaño del deque es 0. reference front() Devuelve el primer objeto.

Deque (6) Resumen de métodos (4) MétodoExplicación reference back() Devuelve el último objeto. void push_front(T&) Inserta un nuevo objeto al comienzo. void push_back(T&) Inserta un nuevo objeto al final. iterator insert(iterator pos, T& x) Inserta el objeto x delante de pos.

Deque (7) Resumen de métodos (5) MétodoExplicación void insert(iterator pos, iterator f, iterator l) Inserta el rango [f, l) delante de pos. void insert(iterator pos, size_type n, T& x) Inserta n copias de x delante de pos. void pop_front() Elimina el primer objeto. void pop_back() Elimina el último objeto.

Deque (8) Resumen de métodos (6) MétodoExplicación iterator erase(iterator pos) Elimina el objeto situado en la posición pos. iterator erase(iterator first, iterator last) Elimina los objetos del rango [first, last) void clear() Elimina todos los objetos. void resize(size_type n, T& x) Reconvierte el tamaño a n eliminando objetos desde el final o insertándolos.

Deque (9) Resumen de métodos (y 7) MétodoExplicación reference operator[](size_type n) Sobrecarga []. Devuelve el n-ésimo objeto. deque& operator=(deque&) Sobrecarga = de la asignación. bool operator==(deque&, deque&) Sobrecarga del operador ==. bool operator<(deque&, deque&) Sobrecarga del operador < por comparación lexicográfica.

Deque (10) Consideraciones sobre los métodos (1) Las funciones miembro begin() y end() devuelven un iterador de acceso aleatorio, en lugar del iterador bidireccional devuelto para las listas Si el tipo del elemento contenido proporciona un destructor, será invocado en las eliminaciones.

Deque (11) Consideraciones sobre los métodos (2) Una inserción insert(), push_front(), o push_back() puede en potencia invalidar todos los iteradores y referencias a elementos del deque A medida que se insertan valores, el índice asociado con un elemento puede cambiar.

Set & Multiset (1) Set es una colección de valores Mantiene los valores de forma ordenada y siempre están ordenados. Optimizado para realizar las inserciones y eliminación de elementos Seleccionarlo en problemas con muchas inserciones, eliminaciones y comprobaciones de la existencia de valores

Set & Multiset (2) Se proporcionan dos conjuntos: Set – cada elemento es único, las inserciones que coincidan con algo que ya está se ignoran Multiset – Se permiten múltiples ocurrencias del mismo valor Cuando se utilicen # include

Set & Multiset (3) Un iterador se declara set ::iterator iterSet; multiset ::iterator iterMultSet;

Set & Multiset (4) Se definen los siguientes tipos

Set & Multiset (4) Resumen de métodos (1) MétodoExplicación set() Constructor de un set vacío. set(key_compare& comp) Constructor de un set vacío, usando la función comp como función key_compare. set(iterator f, iterator l) Constructor de un set copiando el rango [f,l). set(iterator f, iterator l, key_compare& comp) Constructor de un set a copiando el rango [f,l)y usando comp como función para key_compare.

Set & Multiset (5) Resumen de métodos (2) MétodoExplicación set(set&) Constructor copy. iterator begin() Devuelve un iterator al principio iterator end() Devuelve un iterator al final del set. size_type size() Devuelve el tamaño del set.

Set & Multiset (6) Resumen de métodos (3) MétodoExplicación size_type max_size() Devuelve el mayor tamaño posible. bool empty() Devuelve true si el tamaño es 0. pair insert(value_type& x) Inserta x dentro del set. void insert(iterator f, iterator l) Inserta el rango [f,l)en el set.

Set & Multiset (7) Resumen de métodos (4) MétodoExplicación void erase(iterator pos) Elimina el objeto apuntado por pos. size_type erase(key_type& k) Elimina el objeto cuya clave es k. void erase(iterator f, iterator l) Elimina los objetos del rango [f,l). void clear() Elimina todos los objetos.

Set & Multiset (8) Resumen de métodos (5) MétodoExplicación void swap(set&) Intercambia el contenido de dos set. iterator find(key_type& k) Busca el objeto de clave k. size_type count(key_type& k) Cuenta los objetos cuya clave es k. iterator lower_bound( key_type& k) Busca el primer objeto de clave no menor que k.

Set & Multiset (9) Resumen de métodos (6) MétodoExplicación iterator upper_bound(key_type& k) Busca el primer objeto de clave mayor que k. pair equal_range(key_type& k) Encuentra un rango que contiene a todos los objetos cuya clave es k. set& operator=(set&) Sobrecarga = de la asignación. bool operator==(set&,set&) Sobrecarga ==. No es función miembro.

Set & Multiset (9) Resumen de métodos (y 6) MétodoExplicación bool operator<(set&, set&) Sobrecarga <. No es función miembro.

Set & Multiset (10) Creación e Inicialización (1) Se tiene en cuenta: Key: Elemento que será utilizado para realizar la ordenación Compare: Función que se utilizará para realizar las comparaciones. Si no se define se asume la operación <

Set & Multiset (11) Creación e Inicialización (y 2) set set1; set > set2; set set3( mayor () ); set () > setCosas; set setCosas(menor ()); set set4(aList.begin(), aList.end()); set set5(aList.begin(), aList.end(), mayor () ); // constructor copy set set6(set4);

Set & Multiset (12) Inserción de Elementos Únicamente se puede insertar con el método insert() En un multiset,tiene como retorno un iterador al objeto insertado. En un set se devuelve una pareja con el iterador y un valor booleano que indica si se ha insertado correctamente.

Set & Multiset (13) Eliminación de Elementos Se eliminan mediente el método erase() Como parámetros: Valor específico (en multiset borra todos los que coincidan y se retorna el número de elementos eliminados). Iterador que señale a un valor Un par de iteradores para marcar el rango Si el objeto del contenedor tiene destructor será llamado

Set & Multiset (14) Búsqueda y Recuentos (1) El método size() obtiene el tamaño. El método empty() inica si está vacio. El método find() Set - retorna un iterador al elemento o al final Multiset - retorna un iterador a cualquiera de los elementos El método count() cuenta las ocurrencias de un elemento

Set & Multiset (15) Búsqueda y Recuentos (y 2) Mejor en Multiset. El método lower_bound() retorna iterador a la primera entrada que coincide con la key. El método upper_bound() retorna iterador al valor siguiente a la última entrada que coincide con la key. El método equal_range() retorna iterador al valor siguiente a la última entrada que coincide con la key.

Set & Multiset (16) Iteradores La inserción o eliminación de valores no invalida los iteradores Los métodos begin() y end() producen iteradores constantes para asegurar el orden Los métodos rbegin() y rend() producen iteradores para recorridos a la inversa

Set & Multiset (17) Operaciones de Conjunto (1) // Comprobar si es subconjunto if (includes(set1.begin(),set1.end(), set2.begin(),set2.end())) cout << "set1 es un subconjunto de set2" << endl; // une 2 sets en un vector vector v1(set1.size() + set2.size()); set_union(set1.begin(), set1.end(), set2.begin(), set2.end(), v1.begin())

Set & Multiset (18) Operaciones de Conjunto (y 2) Diferencia “Simple”: Elementos de un set que no están en otro ( set_difference() ) Diferencia “Simétrica”: Unión de los elementos que están en el primero y no en el segundo y los que están en el segundo y no en el primero ( set_symetric_difference() )

Set & Multiset (y 19) Otros Algoritmos Genéricos

Bit_set (1) bit_set es un cruce entre set y vector Pero se permiten utilizar los operadores lógicos de bit. Esta clase no tiene ningún iterador

Bit_set (2) Inicialización y Creación // crea un conjunto de 126 bits bit_set bitSet1; // Contiene sólo 100 elementos bit_set bitSet2(100); // contiene 8 elementos bit set bitSet3(" ");

Bit_set (3) Acceso y Comprobación de elementos (1) Se puede acceder a un bit mediante el operador [] Pasa saber si está a 0 ó a 1 se utiliza el método test() Para saber si algún bit está activado se utiliza el método any() El inverso de any() es none()

Bit_set (4) Acceso y Comprobación de elementos (2) El método set() activa un bit como hacer una asignación con el operador [] El método reset() pone a cero el bit indicado El método flip() invierte el contenido de la posición indicada o de todo el conjunto.

Bit_set (4) Acceso y Comprobación de elementos (y 3) El método size() devuelve el tamaño del bit_set. El método count() obtiene el número de bits activados.

Bit_set (6) Operaciones de Bits Funcionan igual que cuando se trabaja con objetos int. Operadores: ~ (inverso de los elementos), & (intersección), | (unión) ^ (or exclusivo) > (Desplazamiento de bits)

Bit_set (7) Conversiones Método to_ulong() convierte el bit_set en un unsigned long. Es un error hacerlo cuando el tamaño del bit_set supera al tipo de datos. Método to_string() convierte el bit_set en un objeto de tipo string.

Map & Multimap (1) En otros lenguajes de programación se denomina Diccionario Tabla Array asociativo Es una estructura de datos indexada similar a los vector o deque

Map & Multimap (2) Diferencias con vector y deque: Pueden estar indexados por cadenas o por número reales (son las claves). Es una estructura de datos ordenada Las búsquedas por clave son muy rápidas Map – Tiene un objeto por cada clave Multimap – Tiene varios objetos para una clave

Map & Multimap (3) Para utilizar un map o un multimap: #include La definición de un iterador es: map ::iterator location; multimap ::iterator location2;

Map & Multimap (4) Además define los siguientes tipos:

Map & Multimap (5) Resumen de métodos (1) MétodoExplicación map() Constructor de un map vacío. map(key_compare& comp) Constructor de un map, usando comp como la key_compare del objeto. map(iterator f, iterator l) Constructor de un map a partir de un rango [f,l) de otro contenedor map(iterator f, iterator l, key_compare& comp) Constructor de un map a partir de un rango [f,l) de otro contenedor usando comp como key_compare.

Map & Multimap (6) Resumen de métodos (2) MétodoExplicación map(map&) Constructor copy. iterator begin() Devuelve un iterator al comienzo del map. iterator end() Devuelve un iterator al final del map. size_type size() Devuelve el número de objetos del map.

Map & Multimap (7) Resumen de métodos (3) MétodoExplicación size_type max_size() Devuelve el máximo tamaño posible del map. bool empty() true si el tamaño del map es 0. void swap(map&) Intercambia los contenidos de 2 map. pair insert(value_type& x) Inserta x en el map.

Map & Multimap (8) Resumen de métodos (4) MétodoExplicación void insert(iterator f, iterator l) Inserta el rango [f,l)en el map. void erase(iterator pos) Elimina el objeto apuntado por pos. size_type erase(key_type& k) Elimina el objeto de clave k. void clear() Elimina todos los objetos.

Map & Multimap (9) Resumen de métodos (5) MétodoExplicación iterator find(key_type& k) Busca el objeto cuya clave es k. size_type count(key_type& k) Cuenta el número de objetos de clave k. iterator lower_bound(key_type& k) Busca el primer objeto cuya clave es no es menor que k. iterator upper_bound(key_type& k) Busca el primer objeto cuya clave es mayor que k.

Map & Multimap (10) Resumen de métodos (y 6) MétodoExplicación pair equal_range(key_type& k) Busca un rango que contenga todos los objetos cuya clave coincide con k. data_type& operator[](key_type& k) Sobrecarga []. Devuelve una referencia al objeto asociado con k. map& operator=(map&) Sobrecarga =. bool operator==(map&, map&) Sobrecarga ==. No es función miembro. bool operator< (map&, map&) Sobrecarga <. No es función miembro.

Map & Multimap (11) Creación e Inicialización (1) // map con key double map map1; // map desde iteradores map map2(unCont.begin(), unCont.end()) // Constructor copia map map3 (map2);

Map & Multimap (12) Creación e Inicialización (y 2) Se puede realizar la asignación de maps con el operador ‘=‘ Podemos intercambiar los valores de dos maps con el método swap()

Map & Multimap (13) Inserción y Acceso // Inserción con insert map3.insert(pair (3, 3)); map3.insert(map ::value_type(3,3)); // Inserciones desde iteradores map2.insert(map3.begin(), map3.end()) // Solo en maps con [] cout << “Num " << map3[7] << endl; map3[7] = 5;

Map & Multimap (14) Eliminación de Valores // Elimina el elemento de clave 4 map3.erase(4); // Elimina elemento de clave 5 map3.erase(map3.find(5) ); // Elimina los valores entre 7 y 11 map3.erase(map3.find(7), map3.find(11));

Map & Multimap (15) Iteradores La inserción o eliminación no invalida los iteradores begin() y end() dan iteradores bidireccionales (en ambos) y rbegin() y rend() los inversos Utilizar el operador * devuelve una pareja de clave-valor. Para acceder: first(clave - constante) y second(valor)

Map & Multimap (16) Búsqueda y Recuento (1) size() – t amaño del map/multimap empty() – booleano que indica si esta vacio find(key) – búsqueda por clave Map – retorna iterador a la pareja clave/objeto Multimap - retorna iterado a la primera pareja clave/objeto Si no encuentra nada iterador de final

Map & Multimap (17) Búsqueda y Recuento (y 2) lower_bound() – primera entrada que coincide con la clave upper_bound() – siguiente valor a la última entrada coincidente equal_range() – devuelve un par de iteradores con los limites del rango count() – número de apariciones de las claves

Map & Multimap (y 18) Otras operaciones interesantes for_each() – aplicación de una función a todos los elementos adjacent_find() – búsqueda de elementos consecutivos duplicados accumulate() – reducción de una secuencia a un único valor

Stack & Queue (1) Pila: estructura LIFO Pila de papeles de un escritorio Cola: estructura FIFO Cola para comprar entradas Son adaptadores, construidos a través de otros contenedores

Stack & Queue (2) Pila: Construidas a partir de vector o deque Cola: Construidas a partir de list o deque Ni las pilas ni las colas definen iteradores por lo que para examinar los elementos hay que hacerlos eliminándolos uno a uno

Stack & Queue (3) Al no implementar iteradores muchos de los algoritmos genéricos no pueden aplicarse. Para utilizarlos: #include

Stack & Queue (4) Definen los siguientes tipos:

Stack & Queue (5) Stack - Resumen de métodos (1) MétodoExplicación stack() Constructor por defecto. Crea un stack vacío. stack(stack&) Constructor copy. bool empty() Devuelve true si el stack está vacío. size_type size() Devuelve el número de objetos que hay.

Stack & Queue (6) Stack - Resumen de métodos (2) MétodoExplicación value_type& top() Devuelve una referencia al objeto de la cima del stack. Precondición: empty() es false. void push(value_type& x) Inserta x en la cima. Postcondición: size() se incrementará en 1 y top() coincidirá con x. void pop() Elimina el objeto de la cima. Precondición: empty() es false. Postcondición: size() se decrementará en 1. stack& operator=(stack&) Sobrecarga =.

Stack & Queue (7) Stack - Resumen de métodos (y 3) MétodoExplicación bool operator==(stack&, stack&) Sobrecarga ==. No es función miembro. bool operator<(stack&, stack&) Sobrecarga <. No es función miembro.

Stack & Queue (7) Stack Como debe ser creada desde otro contenedor se necesita hacer el include de ese otro contenedor. La declaración de una stack es: stack > pila1; stack > pila2; stack > pila3; stack > pila4;

Stack & Queue (8) Queue - Resumen de métodos (1) MétodoExplicación queue() Constructor por defecto. Crea una queue vacío. queue(queue&) Constructor copy. bool empty() Devuelve true si la queue está vacía. size_type size() Devuelve el número de objetos que hay.

Stack & Queue (9) Queue - Resumen de métodos (2) MétodoExplicación value_type& front() Devuelve una referencia al objeto de la cabeza, es decir, al más antiguo insertado. Precondición: empty() es false. value_type& back() Devuelve una referencia al objeto del final, es decir, al insertado más reciente. Precondición: empty() es false. void push(value_type& x) Inserta x al final. Postcondición: size() se incrementará en 1 y back() devolverá x. void pop() Elimina el objeto de la cabeza. Precondición: empty() es false. Postcondición: size() se decrementará en 1.

Stack & Queue (10) Queue - Resumen de métodos (3) MétodoExplicación queue& operator=(queue&) Sobrecarga =. bool operator==(queue&, queue&) Sobrecarga ==. No es función miembro. bool operator<(queue&, queue&) Sobrecarga <. No es función miembro.

Stack & Queue (y 11) Queue Como debe ser creada desde otro contenedor se necesita hacer el include de ese otro contenedor. La declaración de una queue es: queue > cola1; queue > cola2; queue > cola3; queue > cola4;

Priority_queue (1) Útil en los casos en que hay que buscar y eliminar repetidamente el elemento de mayor prioridad Realmente el termino cola no es adecuado porque no se aplica la secuencia FIFO También se trata de un adaptador y se construye a base de otro contenedor

Priority_queue (2) Define los siguientes tipos: No se pueden definir iteradores Sin iteradores el aprovechamiento de los algoritmos genéricos es muy pequeño

Priority_queue (3) Resumen de métodos (1) MétodoExplicación priority_queue() Constructor por defecto. Crea un contenedor vacío y usa Compare(). priority_queue(Compare& comp) Constructor. Crea una priority_queue vacía y usa comp como función de comparación. priority_queue(priority_qu eue&) Constructor copy. priority_queue(value_type* first, value_type* last) Constructor. Crea una priority_queue con los objetos del rango [first, last).

Priority_queue (4) Resumen de métodos (2) MétodoExplicación bool empty() Retorna true si priority_queue no contiene objetos. size_type size() Retorna el número de objetos almacenados. value_type& top() Retorna una referencia al objeto cima, que es el mayor de los almacenados, de acuerdo con la función de comparación. Precondición: empty() es false. void push(value_type& x) Inserta x en la priority_queue. Postcondicón: size() se incrementará en 1.

Priority_queue (5) Resumen de métodos (3) MétodoExplicación void pop() Elimina el objeto de la cima. Precondicón: empty() es false. Postcondición: size() se decrementará en 1. priority_queue& operator= (priority_queue&) Sobrecarga de la asignación =.

Priority_queue (6) Se tienen que poder comparar los elementos por el operador < o mediante una función. Las estructuras que se utilizan son: Vector Deque

Priority_queue (7) Se necesitan realizar los siguientes includes #include Las colas construidas sobre: Vector – Suelen ser más pequeñas Deque – Suelen ser más rápidas Pero las diferencias son muy pequeñas

Priority_queue (8) Ejemplos de generación: priority_queue > colaPri1; priority_queue, mayor > colaPri2; priority_queue > ColaPri4(lista1.begin(), lista2.end()); priority_queue > ColaPri5(eventComp); priority_queue > colaPri6(aVector.begin(), aVector.end(), eventComp);

String (1) Representa una secuencia de caracteres Se dispone de un mayor control que con char* Si queremos utilizarlos debemos hacer el include #include

String (2) Tiene muchísimas operaciones que pueden hacernos la vida más fácil Habituales como: begin() end() size() length() operator[] c_str() operator= operator+= operator+ operator== operator!= operator<

String (3) Pero además tiene otras (muy sobrecargadas) como insert() append() push_back erase() replace() copy() find() compare() operator>> getline()

String (4) Para más información: Apuntes de la asignatura

Categorías de Iteradores (1) Como ya se ha comentado existen varias categorías de iteradores:

Categorías de Iteradores (2) En la siguiente tabla se parte de las siguientes premisas: i y j son dos iteradores de la misma categoría x es un objeto del mismo tipo que los objetos que contiene el contenedor n es una variable de tipo int

Categorías de Iteradores (3)

Algoritmos Genéricos (1) A muchos de los algoritmos genéricos se les pasa una función como argumento:

Algoritmos Genéricos (2) En los apuntes de la asignatura se os indican el tipo de funciones que hay que pasar a cada algoritmo:

Algoritmos Genéricos (3) Pero también se podían pasar clases con el operador () sobrecargado. Son las funciones objetos Con esto se genera un código más flexible y eficiente

Algoritmos Genéricos (4) Ejemplo de función objeto: // Clase para Función-objeto class Comparar { public: bool operator() (const Elemento * e1, const Elemento * e2) { return *e1 < *e2; } };

Algoritmos Genéricos (5) La STL ya tiene implementadas algunas:

Algoritmos Genéricos (5) Muchos de los algoritmos genéricos ya los hemos comentado. En los apuntes está la lista de cada uno de ellos y que es lo que hace.

Web de Referencia Una buena web de referencia para consultas es: Buena documentación de C++ y de la STL

3, 2, 1… a volar…

Tecnología de la Programación Javier Nieves Acedo Standar Template Library (STL)