La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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

Presentaciones similares


Presentación del tema: "Tecnología de la Programación Javier Nieves Acedo Standar Template Library (STL)"— Transcripción de la presentación:

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

2 ¿ Qué es la Standard Template Library?

3 Como su nombre indica, es una librería…

4 … de contenedores…

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

6 … pero hay que aprender a utilizar sus funciones…

7 … y va a ser muy fácil …

8 … y para comenzar …

9 … una vista general …

10 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++

11 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

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

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

14 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

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

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

17 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

18 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?

19 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() …

20 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

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

22 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.

23 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.

24 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)

25 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

26 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

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

28 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

29 Ahora veremos cada contenedor …

30 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 []

31 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).

32 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

33 Vector & Vector (4)

34 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.

35 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.

36 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.

37 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.

38 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

39 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.

40 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

41 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());

42 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);

43 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

44 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

45 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

46 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;

47 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());

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

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

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

51 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();

52 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)

53 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

54 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

55 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.

56 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.

57 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.

58 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.

59 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.

60 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.

61 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.

62 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<.

63 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 <.

64 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);

65 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);

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

67 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);

68 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

69 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());

70 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);

71 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.

72 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()

73 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()

74 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;

75 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);

76 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

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

78 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

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

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

81 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.

82 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.

83 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.

84 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.

85 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.

86 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.

87 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.

88 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.

89 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.

90 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

91 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

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

93 Set & Multiset (4) Se definen los siguientes tipos

94 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.

95 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.

96 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.

97 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.

98 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.

99 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.

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

101 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 <

102 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);

103 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.

104 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

105 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

106 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.

107 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

108 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())

109 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() )

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

111 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

112 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("10101010");

113 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()

114 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.

115 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.

116 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)

117 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.

118 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

119 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

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

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

122 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.

123 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.

124 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.

125 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.

126 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.

127 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.

128 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);

129 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()

130 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;

131 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));

132 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)

133 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

134 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

135 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

136 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

137 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

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

139 Stack & Queue (4) Definen los siguientes tipos:

140 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.

141 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 =.

142 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.

143 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;

144 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.

145 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.

146 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.

147 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;

148 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

149 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

150 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).

151 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.

152 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 =.

153 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

154 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

155 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);

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

157 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<

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

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

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

161 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

162 Categorías de Iteradores (3)

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

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

165 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

166 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; } };

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

168 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.

169 Web de Referencia Una buena web de referencia para consultas es: http://www.cplusplus.com/ Buena documentación de C++ y de la STL

170 3, 2, 1… a volar…

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


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

Presentaciones similares


Anuncios Google