1 1 Clase Lista C++ Estándar Agustín J. González Versión original de Kip Irvine ElO329
2 Estructura de Datos Lista (List) Una estructura de datos Lista es una secuencia conectada de nodes, cada uno de los cuales contiene algún dato. Hay un nodo al comienzo llamado la cabeza o frente (head o front). Hay un nodo de término llamado la cola o atrás (tail o back). Una Lista sólo puede ser recorrida en secuencia, usualmente hacia atrás o adelante. Hay varias formas de implementar una lista, como se muestra a continuación...
3 Lista Simplemente Enlazada FredJimAnneSusan Una lista simplemente enlazada tiene punteros conectando los nodos sólo en dirección hacia la cola. Cada uno de los nodos contiene un string en este ejemplo: (head) (tail)
4 Lista Doblemente Enlazada FredJimAnneSusan Una lista doblemente enlazada tiene punteros conectando los nodos en ambas direcciones. Esto permite recorrer la lista en ambas direcciones: (head) (tail) Las clase List en la biblioteca estándar usa esta implementación.
5 Interfaz de clase List
6 Clase List Estándar C++ La clase list es una clase template (plantilla) en la Biblioteca estándar C++* Podemos crear listas que contengan cualquier tipo de objeto. Las clases list y vector comparten muchas operaciones, incluyendo: push_back(), pop_back(), begin(), end(), size(), y empty() El operador sub-índice ( [ ] )no puede ser usado con listas. * Esta no es exactamente la misma que la "Standard Template Library" (STL) actualmente mantenida por Silicon Graphics Corporation (www.sgi.com), pero compatible en la gran mayoría de los casos.
7 Agregar y remover nodos #include list staff; staff.push_back("Fred"); staff.push_back("Jim"); staff.push_back("Anne"); staff.push_back("Susan"); cout
8 Iteradores list ::iterator pos; pos = staff.begin(); cout
9 Iteradores void ShowList( list & sList ) { list ::iterator pos; pos = sList.begin(); while( pos != sList.end()) { cout
10 Iterador Constante (const_iterator) void ShowList( const list & sList ) { list ::const_iterator pos; pos = sList.begin(); while( pos != sList.end()) { cout
11 Iterador reverso (reverse_iterator) void ShowReverse( list & sList ) { list ::reverse_iterator pos; pos = sList.rbegin(); while( pos != sList.rend()) { cout
12 Iterador constante Reverso (const_reverse_iterator) void ShowReverse( const list & sList ) { list ::const_reverse_iterator pos; pos = sList.rbegin(); while( pos != sList.rend()) { cout
13 Inserción de Nodos list staff; staff.push_back("Barry"); staff.push_back("Charles"); list ::iterator pos; pos = staff.begin(); staff.insert(pos, "Adele"); // "Adele","Barry","Charles" pos = staff.end(); staff.insert(pos, "Zeke"); // "Adele","Barry","Charles","Zeke" La función miembro insert() inserta un nuevo nodo antes de la posición del iterador. El iterador sigue siendo válido después de la operación.
14 Eliminación de Nodos list staff; staff.push_back("Barry"); staff.push_back("Charles"); list ::iterator pos = staff.begin(); staff.erase(pos); cout
15 Mezcla de Listas list staff1; staff1.push_back("Anne"); staff1.push_back("Fred"); staff1.push_back("Jim"); staff1.push_back("Susan"); list staff2; staff2.push_back("Barry"); staff2.push_back("Charles"); staff2.push_back("George"); staff2.push_back("Ted"); staff2.merge( staff1 ); La función miembro merge() combina dos listas en según el operador de orden de los objetos que contiene. Por ejemplo en este caso el orden es alfabético.
16 Ordenamiento de una Lista list staff;. staff.sort(); staff.reverse(); La función miembro sort() ordena la lista en orden ascendente. La función reverse() invierte la lista.
17 Aplicación: Catálogo en Línea Crear una clase para ítems que describa ítems de un catálogo de venta en línea. Un ítem contiene un número de identificación ID, descripción, y precio. Crear una clase Catálogo para mantener los ítems. El catálogo debe encapsular un objeto C++ Lista y proveer operaciones para agregar, buscar, y remover ítems de catálogo. (cubre: transparencias 16 - 29)
18 Clase Ítem class Item { public: Item( const string & catalogID, const string & description = "", double price = 0); bool operator ==(const Item & I2) const; friend ostream & operator
19 19 Nota sobre sobrecarga del operador de salida (
20 20 Nota sobre sobrecarga del operador de salida (
21 Clase Catálogo class Catalog { public: void Add( const Item & I ); // Add a new item to the catalog list ::iterator Find( const Item & anItem ); // Find an item, return an iterator that // either points to the item or contains NULL // if the item was not found void Remove( list ::iterator I ); // Remove the item pointed to by I friend ostream & operator
22 Programa Cliente - 1 //Create a catalog and add some items. Catalog catCurrent; catCurrent.Add( Item("00001", "Chinese TaiChi Sword",75.00)); catCurrent.Add( Item("00002", "Fantasy Dragon Sword",125.00)); catCurrent.Add( Item("00003", "Japanese Taichi Sword",85.00)); catCurrent.Add( Item("00004", "Ornate Samurai Sword",150.00)); catCurrent.Add( Item("00005", "Bamboo Practice Sword",35.00));
23 Programa Cliente - 2 Catalog catBackup( catCurrent ); // Notice how C++ creates an automatic // copy constructor catBackup = catCurrent; // C++ also creates an automatic assignment // operator
24 Programa Cliente - 3 // Search for an item list ::iterator iter = NULL; iter = catCurrent.Find( Item("00003") ); if( iter != NULL ) { cout
25 Programa Cliente - 4 // Remove the item we just found catCurrent.Remove( iter ); // Don't try to use the same iterator! // (runtime error) catCurrent.Remove( iter );
26 Programa Cliente - 5 // Display the entire catalog cout
27 Implementación de la Clase Ítem - 1 Item::Item(const string &catalogID, const string &description, double price) // Constructor with parameters { m_sCatalogID = catalogID; m_sDescription = description; m_nPrice = price; }
28 Implementación de la Clase Ítem - 2 bool Item::operator ==(const Item & I2) const // overload the equality operator { return m_sCatalogID == I2.m_sCatalogID; } ostream & operator
29 Implementación de la Clase Catalogo - 1 void Catalog::Add(const Item & I) // Add a new item to the catalog { m_vItems.push_back( I ); }
30 Implementación de la Clase Catalogo - 2 list ::iterator Catalog::Find( const Item & anItem ) // Find an item, return an iterator that // either points to the item or contains NULL // if the item was not found { list ::iterator I; for(I = m_vItems.begin(); I != m_vItems.end(); I++) { if( *I == anItem ) // Item overloads == oper return I; // found a match } return NULL; // failed to find a match }
31 Implementación de la Clase Catalogo - 3 void Catalog::Remove( list ::iterator I ) // Remove a single list node. This will cause a // runtime error if the iterator is invalid. { if( I != NULL ) { m_vItems.erase( I ); } Un buen manejo de excepciones previene este posible error de ejecución.
32 Implementación de la Clase Catalogo - 4 ostream & operator
33 33 Fin