19 Contenedores De Stl Basados En Arboles

33
Cómo Usar los Cómo Usar los Contenedores de STL Contenedores de STL Basados en Árboles Basados en Árboles Apoyo SSD5 Apoyo SSD5

Transcript of 19 Contenedores De Stl Basados En Arboles

Page 1: 19 Contenedores De Stl Basados En Arboles

Cómo Usar los Cómo Usar los Contenedores de STL Contenedores de STL Basados en Árboles Basados en Árboles

Apoyo SSD5Apoyo SSD5

Page 2: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 22

ConjuntosConjuntos

�� El contenedor El contenedor setset de STL almacena de STL almacena elementos únicos en un conjunto elementos únicos en un conjunto ordenado.ordenado.

�� Las tareas de adición, eliminación y Las tareas de adición, eliminación y acceso de elementos están garantizadas acceso de elementos están garantizadas por el estándar de STL para tomar un por el estándar de STL para tomar un tiempo logarítmico en un tiempo logarítmico en un setset . .

Page 3: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 33

ConjuntosConjuntos

�� Insertar elementos con un criterio de Insertar elementos con un criterio de ordenación no degradará estas ordenación no degradará estas operaciones a tiempo lineal, como es el operaciones a tiempo lineal, como es el caso de los árboles binarios de búsqueda.caso de los árboles binarios de búsqueda.

�� Declarar objetos de la clase Declarar objetos de la clase setset es similar es similar a declarar otros contenedores de STL. a declarar otros contenedores de STL.

Page 4: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 44

ConjuntosConjuntos

�� Un programador especifica el tipo de dato Un programador especifica el tipo de dato que el conjunto puede contener como un que el conjunto puede contener como un parámetro parámetro plantillaplantilla ((templatetemplate).).

�� Para acceder al contenedor Para acceder al contenedor setset , un , un programador debe incluir la biblioteca programador debe incluir la biblioteca <<setset >.>.

Page 5: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 55

ConjuntosConjuntos

�� Agregar elementos a un Agregar elementos a un setset se realiza se realiza usando la función miembro usando la función miembro insertinsert ..

�� La función miembro La función miembro sizesize regresa el regresa el número de elementos almacenados en el número de elementos almacenados en el conjunto conjunto

Page 6: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 66

ConjuntosConjuntos

�� La función La función findfind busca un elemento busca un elemento dentro de dentro de setset . .

�� Esta función regresa un Esta función regresa un iteradoriterador al al elemento encontrado. elemento encontrado.

�� Si el elemento no es encontrado, la Si el elemento no es encontrado, la función función findfind regresa un regresa un iteradoriterador igual igual al al iteradoriterador regresado por la función regresado por la función endend ..

Page 7: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 77

set<set< intint > s1;> s1;

set<set< intint > s2;> s2;

for (for ( intint i = 0; i < 20; i++) {i = 0; i < 20; i++) {

s1.insert(i);s1.insert(i);

s2.insert(30 s2.insert(30 -- i);i);

}}coutcout << "size of s1: " << s1.size() << << "size of s1: " << s1.size() << endlendl ;;

coutcout << "size of s2: " << s2.size() << << "size of s2: " << s2.size() << endlendl ;;

if (s1.find(10) != s1.end()) { if (s1.find(10) != s1.end()) { coutcout << "s1 << "s1 containscontains 1010 \\ nn";";

} }

Page 8: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 88

ConjuntosConjuntos

�� Cuatro de los algoritmos genéricos de STL Cuatro de los algoritmos genéricos de STL están diseñados específicamente para están diseñados específicamente para usarse con conjuntos. usarse con conjuntos.

�� EstasEstas son son laslas funcionesfuncionesset_intersectionset_intersection , , set_unionset_union , , set_differenceset_difference , y , y set_symmetric_differenceset_symmetric_difference

Page 9: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 99

�� Es importante entender que estas cuatro Es importante entender que estas cuatro funciones también pueden ser usadas con funciones también pueden ser usadas con otros contenedores de STL (como otros contenedores de STL (como vectorsvectorsy y dequesdeques).).

�� Sin embargo, son más eficientes al usarse Sin embargo, son más eficientes al usarse en conjuntos. en conjuntos.

Page 10: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 1010

ostream_iteratorostream_iterator <<intint >>out(coutout(cout , " ");, " ");

// Set intersection// Set intersectioncoutcout << "<< " \\ nsetnset intersection: ";intersection: ";set_intersection(s1.begin(), s1.end(), set_intersection(s1.begin(), s1.end(),

s2.begin(), s2.end(), out);s2.begin(), s2.end(), out);// Set union// Set unioncoutcout << "<< " \\ nsetnset union: ";union: ";set_union(s1.begin(), s1.end(),set_union(s1.begin(), s1.end(),

s2.begin(), s2.end(),s2.begin(), s2.end(),out);out);

// Set difference// Set differencecoutcout << "<< " \\ nsetnset difference: ";difference: ";set_difference(s1.begin(), s1.end(),set_difference(s1.begin(), s1.end(),

s2.begin(), s2.end(),s2.begin(), s2.end(),out);out);

// Set symmetric difference// Set symmetric differencecoutcout << "<< " \\ nsetnset symmetric difference: ";symmetric difference: ";set_symmetric_difference(s1.begin(), s1.end(),set_symmetric_difference(s1.begin(), s1.end(),

s2.begin(), s2.end(),s2.begin(), s2.end(),out);out);

Page 11: 19 Contenedores De Stl Basados En Arboles

MapasMapas

Page 12: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 1212

MapasMapas

�� El contenedor El contenedor mapmap de STL es una de STL es una estructura asociativa que almacena datos estructura asociativa que almacena datos en pares de en pares de valorvalor -- llavellave ..

�� El contenedor El contenedor mapmap es considerado es considerado asociativo, debido a que asociativo, debido a que mapeamapea, o asocia, , o asocia, una pieza de datos (una llave) con otra una pieza de datos (una llave) con otra pieza de datos (un valor) pieza de datos (un valor)

Page 13: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 1313

MapasMapas

�� Declarar un objeto de tipo Declarar un objeto de tipo mapmap involucra involucra especificar el tipo de dato, tanto de la llave especificar el tipo de dato, tanto de la llave como del valor.como del valor.

�� La llave se especifica con el primer La llave se especifica con el primer parámetro plantilla, y el valor se especifica parámetro plantilla, y el valor se especifica con un segundo parámetro plantilla con un segundo parámetro plantilla

Page 14: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 1414

MapasMapas

�� Por ejemplo, el siguiente listado declara Por ejemplo, el siguiente listado declara dos objetos dos objetos mapmap. .

�� El primero es un mapa de tipo El primero es un mapa de tipo stringstring a a stringstring ..

�� El segundo es un mapa de tipo El segundo es un mapa de tipo stringstring a a intint ..

Page 15: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 1515

MapasMapas

// // A map of strings to A map of strings to stringsmapstringsmap <string, string> m1;<string, string> m1;

// A map of strings to // A map of strings to intsints map<stringmap<string , , intint > m2;> m2;

Page 16: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 1616

MapasMapas

�� Para insertar elementos en un mapa se Para insertar elementos en un mapa se requiere tanto la llave como el valor.requiere tanto la llave como el valor.

�� El siguiente listado inserta dos pares El siguiente listado inserta dos pares valorvalor -- llavellave en un mapa. en un mapa.

Page 17: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 1717

// A map of strings to string// A map of strings to string

smapsmap<string, string> m1;<string, string> m1;

// A map of strings to // A map of strings to intint

smapsmap<string, <string, intint > m2;> m2;

m1.insert(pair<string, string>("apple", m1.insert(pair<string, string>("apple", "a small red fruit"));"a small red fruit"));

m1.insert(pair<string, string>("orange", m1.insert(pair<string, string>("orange",

"a small orange fruit"));"a small orange fruit"));

Page 18: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 1818

MapasMapas

�� Un mecanismo alternativo para agregar Un mecanismo alternativo para agregar elementos a un mapa es el operador elementos a un mapa es el operador sobrecargado de doble corchete.sobrecargado de doble corchete.

�� El siguiente listado usa este operador para El siguiente listado usa este operador para insertar un elemento en el mapa. insertar un elemento en el mapa.

m1["banana"] = "a long yellow fruit";m1["banana"] = "a long yellow fruit";

Page 19: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 1919

MapasMapas

�� De manera similar al contenedor De manera similar al contenedor setset , el , el contenedor contenedor mapmap ofrece las funciones ofrece las funciones miembro miembro sizesize , , findfind , y , y countcount ..

�� Un programador también puede iterar a Un programador también puede iterar a través de los elementos almacenados en través de los elementos almacenados en un mapa.un mapa.

Page 20: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 2020

MapasMapas

�� La implantación de la iteración de un La implantación de la iteración de un mapa autoriza la mapa autoriza la examinaciónexaminación, debido a , debido a que es ligeramente más compleja que la que es ligeramente más compleja que la iteración estándar del contenedor.iteración estándar del contenedor.

Page 21: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 2121

map<string, string>::map<string, string>:: iteratoriterator it = it = m1.begin();m1.begin();

for ( ; it != m1.end(); it++) {for ( ; it != m1.end(); it++) {

coutcout << it<< it -- >first << ": " << it>first << ": " << it -- >second >second

<< << endlendl ;;

} }

Page 22: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 2222

MapasMapas

�� El listado anterior itera a través de los El listado anterior itera a través de los elementos del objeto del mapa elementos del objeto del mapa m1m1. .

�� El aspecto importante a notar es cómo El aspecto importante a notar es cómo son accedidos la llave y el valor de cada son accedidos la llave y el valor de cada objeto. objeto.

�� Internamente, un mapa almacena la llave Internamente, un mapa almacena la llave y el valor para cada elemento de los y el valor para cada elemento de los datos, en un objeto de tipo datos, en un objeto de tipo pair<keypair<key , , valuevalue >.>.

Page 23: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 2323

MapasMapas

�� Para acceder a la llave de un elemento a Para acceder a la llave de un elemento a través de un través de un iteradoriterador , se debe , se debe dereferenciardereferenciar el el iteradoriterador y luego usar el y luego usar el miembro de los datos miembro de los datos firstfirst del objeto del objeto pairpair . .

�� El miembro de los datos El miembro de los datos secondsecond brinda brinda acceso al valor acceso al valor

Page 24: 19 Contenedores De Stl Basados En Arboles

Colas de PrioridadColas de Prioridad

Page 25: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 2525

Colas de PrioridadColas de Prioridad

�� El adaptador de STL El adaptador de STL priority_queuepriority_queuebrinda a los programadores una interfaz brinda a los programadores una interfaz más conveniente para una cola de más conveniente para una cola de prioridad. prioridad.

�� Como el nombre sugiere, las colas de Como el nombre sugiere, las colas de prioridad se comportan de forma similar a prioridad se comportan de forma similar a las colas regulares las colas regulares

Page 26: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 2626

Colas de PrioridadColas de Prioridad

�� Las colas de prioridad, por lo tanto, Las colas de prioridad, por lo tanto, permiten el acceso solamente al elemento permiten el acceso solamente al elemento con la prioridad más alta. con la prioridad más alta.

Page 27: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 2727

#include <#include < iostreamiostream >#include >#include <<cstdlibcstdlib >#include <queue>using namespace >#include <queue>using namespace std;intstd;int main(intmain(int argcargc , char* , char* argvargv []) {[]) {

priority_queuepriority_queue <<intint > > pqpq ;;pq.push(1);pq.push(1);pq.push(4);pq.push(4);pq.push(2);pq.push(2);coutcout << << pq.toppq.top () << () << endlendl ;;

// outputs '4‘// outputs '4‘pq.poppq.pop ();();coutcout << << pq.toppq.top () << () << endlendl ;;

// outputs '2‘// outputs '2‘pq.poppq.pop ();();coutcout << << pq.toppq.top () << () << endlendl ;;

// outputs '1‘// outputs '1‘coutcout << << pq.sizepq.size () << () << endlendl ;;

// outputs '1‘// outputs '1‘return EXIT_SUCCESS;return EXIT_SUCCESS;

} }

Page 28: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 2828

Colas de PrioridadColas de Prioridad

�� El adaptador El adaptador priority_queuepriority_queue requiere requiere algunos mecanismos para determinar la algunos mecanismos para determinar la prioridad relativa de elementos.prioridad relativa de elementos.

�� Por Por defaultdefault, el adaptador , el adaptador priority_queuepriority_queue usa el operador usa el operador << de de los elementos, para determinar prioridad los elementos, para determinar prioridad

Page 29: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 2929

Colas de PrioridadColas de Prioridad

�� Existe un mecanismo alternativo que un Existe un mecanismo alternativo que un programador puede implantar para usar programador puede implantar para usar una una priority_queuepriority_queue con objetos que con objetos que no proveen un operador no proveen un operador <.<.

�� Este mecanismo involucra proveer al Este mecanismo involucra proveer al adaptador adaptador priority_queuepriority_queue con una con una función comparativa.función comparativa.

Page 30: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 3030

Colas de PrioridadColas de Prioridad

�� Esta función comparativa dicta cómo el Esta función comparativa dicta cómo el adaptador adaptador priority_queuepriority_queue debe debe determinar la prioridad de los elementos determinar la prioridad de los elementos almacenadosalmacenados

Page 31: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 3131

#include <#include < iostreamiostream >>#include <#include < cstdlibcstdlib >>#include <string>#include <string>#include <queue>#include <queue>using namespace std;using namespace std;class class StringCompareStringCompare {{public:public:

boolbool operator()(constoperator()(const string& s1, const string& s2) string& s1, const string& s2) {{

if (s1.length() < s2.length()) {if (s1.length() < s2.length()) {return true;return true;

}}else {else {

return false;return false;}}

}}};};

Page 32: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 3232

intint main(intmain(int argcargc , char* , char* argvargv []) {[]) {// Create a priority queue that assigns longer// Create a priority queue that assigns longer

// strings a higher priority.// strings a higher priority.

priority_queuepriority_queue <string, vector<string>,<string, vector<string>, StringCompareStringCompare > > pqpq;;

pq.push("smallpq.push("small string");string");pq.push("apq.push("a slightly longer string");slightly longer string");pq.push("anotherpq.push("another small string");small string");coutcout << << pq.toppq.top () << () << endlendl ;;pq.poppq.pop ();();coutcout << << pq.toppq.top () << () << endlendl ;;pq.poppq.pop ();();coutcout << << pq.toppq.top () << () << endlendl ;;return EXIT_SUCCESS;return EXIT_SUCCESS;

}}

Page 33: 19 Contenedores De Stl Basados En Arboles

Mtl Lourdes CahuichMtl Lourdes Cahuich 3333

�� Proveer una función comparativa a un Proveer una función comparativa a un priority_queuepriority_queue es también ventajoso es también ventajoso cuando un operador cuando un operador << existente no es existente no es apropiado para su uso en la determinación apropiado para su uso en la determinación de prioridades de prioridades

�� Si el listado no provee la función Si el listado no provee la función comparativa definidacomparativa definida--porpor--elel--usuario, la usuario, la cola de prioridad podría usar el operador cola de prioridad podría usar el operador <.<.

�� Esto podría causar que el programa Esto podría causar que el programa asigne la prioridad más alta a la cadena asigne la prioridad más alta a la cadena de caracteres que alfabéticamente de caracteres que alfabéticamente precede a las otras cadenas.precede a las otras cadenas.