Dinamismo y Contenedores Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires (C++ Avanzado) Depto. de Computación Algoritmos y Estructuras.

Slides:



Advertisements
Presentaciones similares
Creación y destrucción de objetos
Advertisements

Lenguaje de programación Java
Unidad 5 Listas Enlazadas Bibliografía: Algoritmos y Estructuras de datos de Aguilar y Martinez. Unidad 9 Autor: Ing Rolando Simon Titiosky.
Programación II Listas
Estructuras de datos y algoritmos
Programación I Teoría III
Direcciones, Arreglos y Argumentos de Funciones
Funciones. Programación, Algoritmos y Estructuras de Datos.
Punteros Universidad Nacional Mayor de San Marcos
POO en C++: Sintaxis En el .h debe aparecer la declaración de la clase: class NombreClase { private: // atributos y métodos privados public: // atributos.
Tema 1. Introducción a la programación (Lenguaje java).
Tratamiento de listas en Java
Funcionamiento, programación
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.
Abstracción de Datos La abstracción es un recurso fundamental en la programación orientada a objetos y está además fuertemente ligado a reusabilidad.
Implementación de Listas
Unidad 3 Punteros.
Oscar Bedoya. Edificio 331, 2º piso, E.I.S.C. Estructuras de datos y algoritmos.
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
L ISTAS E NLAZADAS No son mas que un conjunto o lista de objetos que a diferencia de los vectores, estas poseen la capacidad de crecer o decrecer. Por.
Estructuras dinámicas de datos, TAD Lista, parte 2
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Igor Santos Grueiro. De este tipo de pilas NO vamos a hablar.
Tema 6: Clases Antonio J. Sierra.
Conceptos Objeto Clase Atributo / Método Encapsulamiento Mensaje
Semana 5 Subprogramas..
Clase Teórica No. 4 Programación IV
ÁRBOLES BINARIOS DE BÚSQUEDA
C++ LISTAS C++ 11/04/2017 Ing. Edgar Ruiz Lizama.
Introducción a los punteros
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Objetos.
Estructura de Datos y Algoritmos
Descomposición Modular. Funciones
Programación Orientada a Objetos usando CONSTRUCTORES DESTRUCTORES.
PUNTEROS Ing Anghello Quintero.
Estructuras de Datos Dinámicas: Listas Programación I Departamento de Informática Universidad Nacional de San Luis Argentina 2014.
PROGRAMACIÓN ORIENTADA A OBJETOS USANDO C++
1 Asignación Dinámica de Memoria Agustín J. González Versión original de Kip Irvine ELO 329.
Herramientas de polimorfismo y herencia en C++
Árboles Binarios Estructuras de Datos.
Manejo de Punteros y objetos en memoria dinámica en C++
FUNCIONES Conceptos básicos. Retorno de una función Clases de funciones. Paso de parámetros. Funciones y arrays.
Herencia y tipos ● Cuanta memoria se debe asignar a un objeto cuando se asigna en la pila ● La asignación debe hacerse antes de que se conozca la cantida.
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.
Listas Ligadas Simples. Definíción I  Es, en sencillas palabras. un grupo de datos organizados secuencialmente, pero a diferencia de los arreglos, la.
Constructor  Un constructor es un método que inicia un objeto inmediatamente después de su creación. De esta forma nos evitamos el tener que iniciar.
1 Definición y Conversión de datos Agustín J. González ELO-329.
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
Detalles Generales sobre Java
Sesión 10: Sobrecarga (2) /1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad.
1 Asignación Dinámica de Memoria Agustín J. González ELO 329.
INSTITUTO TECNOLOGICO DE APIZACO
LENGUAJE “C” Programación.
El lenguaje C++ Isidro González Caballero (Universidad de Oviedo) Técnicas de Comp. en Física Santander, 13/12/
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Caso.
Listas. Utilización de un TAD Lista. Interfaz del TAD LISTA public interface Lista { void crearNodo (); /*Crea un nuevo nodo en el TadLista*/ int devolverClave.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Caso.
M.C. Meliza Contreras González
Laboratorio de programación
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Tipo.
1 Definición y Conversión de datos Agustín J. González ELO-329.
Listas Dinámicas.
Algunas Características de C++ no presentes en C Agustín J. González ELO-329.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Arreglo.
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).
Prof. Manuel B. Sánchez. Declaración de Objetos Una vez que la clase ha sido implementada se pueden declarar objetos como variables locales de métodos.
UNIVERSIDAD DIEGO PORTALES Facultad de Ingeniería Programación Avanzada TIPOS ABSTRACTOS DE DATOS TAD Tema: TIPOS ABSTRACTOS DE DATOS TAD Subtema: LISTAS.
Lenguaje de Programación II Prof. Rafael Montenegro B. Carrera: T.S.U en Informática Periodo: 2014-I.
Transcripción de la presentación:

Dinamismo y Contenedores Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires (C++ Avanzado) Depto. de Computación Algoritmos y Estructuras de Datos II 1er Cuatrimetre de 2005

Dinamismo y Contenedores Algoritmos y Estructuras de Datos II Repaso… Punteros: Declaración: int *p; ← p es puntero a un int Operadores: Supongamos p un puntero, y s una variable. *p : devuelve el contenido de lo que apunta p (op. de des-referenciación) &s : devuelve la dirección de la variable s (op. de referenciación) Ejemplo : Cuánto vale… x = *p; x = 200; p = &x; *p = 400; *p = &x; ( Tipo de dato al que apunta)

Dinamismo y Contenedores Algoritmos y Estructuras de Datos II Llamadas a función: x Valor: Se copian los objetos. Ej: float suma(float a,float b) x Referencia: Argumentos de referencia: se pueden modificar los pasados como parámetro. Ej: float suma(float &a,float &b){ a = a + b; return a; } ¿cuánto vale x luego de la llamada suma( x=3, y=4)? Punteros: Ej: float suma(float *a,float *b){ return = *a + *b; }

Dinamismo y Contenedores Algoritmos y Estructuras de Datos II Const: Seguridad en el manejo de datos. Ej: float suma (const float *a, const float *b) 4 maneras de pasarle un puntero a una función ptr no constante a dato no constante.(- restrictivo) ptr no constante a dato constante. ptr constante a dato no constante. ptr constante a dato constante.(+ restrictivo) “a es un puntero a un float constante” Los objetos grandes, como las estructuras de datos, se deben pasar con punteros a datos constantes (o referencias a datos constantes), con el fin de lograr : desempeño de la llamada por referencia, y la seguridad de la llamada por valor. Los objetos grandes, como las estructuras de datos, se deben pasar con punteros

Dinamismo y Contenedores Algoritmos y Estructuras de Datos II Templates: Reutilización de código. Evita tener que programar funciones sobrecargadas. Parámetro formal  Templates de funciones Ej: template void printArray(const T *arreglo, const int cant) { for (int i=0; i<cant; i++) cout << arreglo[i] << " "; cout<<endl; }  Templates de clases Ej: La clase conjunto acotado que vimos anteriormente. Operadores que uso en la definición del template deben estar sobrecargados adecuadamente.

Dinamismo y Contenedores Algoritmos y Estructuras de Datos II Asignación dinámica de memoria

Dinamismo y Contenedores Algoritmos y Estructuras de Datos II Supongamos: Class Node{ public: Node(int); void SetData(int);... private: int data; Node *nextPtr; } Ejemplo de clase auto-referenciada Estructuras dinámicas de datos requieren asignación dinámica de memoria.

Dinamismo y Contenedores Algoritmos y Estructuras de Datos II Operadores: new : toma como argumento el tipo de objeto que está asignando dinámicamente y devuelve un puntero a dicho objeto. Ej: Node *nuevoPtr = new Node(10); delete: toma como argumento el puntero al objeto a ser destruido, y libera la memoria asignada por el new. Ej: delete nuevoPtr; Cuando ya no es necesaria la memoria que asigné dinámicamente con new, se debe usar delete para devolver la memoria al sistema. SINO → LEAKS (fuga de memoria)

Dinamismo y Contenedores Algoritmos y Estructuras de Datos II Lista Enlazada (un ejemplo de contenedor)

Dinamismo y Contenedores Algoritmos y Estructuras de Datos II Abstractamente: elem1elem2elem3 Lista Enlazada (un ejemplo de contenedor) nodo ¿por qué es mejor que un arreglo? - si sobredimensionamos un arreglo → desperdiciamos espacio. - si el arreglo es ordenado → la inserción y el borrado son costosos. ¿siempre es mejor que un arreglo? + en un arreglo, puedo acceder inmediatamente a cualquier posición del mismo (las listas no permiten este acceso directo).

Dinamismo y Contenedores Algoritmos y Estructuras de Datos II La implementación: Lista Enlazada (un ejemplo de contenedor) template class ListNode { friend class List ;//hace que List sea friend public: ListNode(const NodeType &);//constructor NodeType getData() const;//devuelve datos del nodo private: NodeType data;//dato del nodo ListNode *nextPtr;//ptro al siguiente nodo }; Vamos a hacerlo (un poquito) más interesante: firstPtrlastPtr Definimos la clase template ListNode:

Dinamismo y Contenedores Algoritmos y Estructuras de Datos II Lista Enlazada (un ejemplo de contenedor) //constructor template ListNode ::ListNode(const NodeType &info) { this.data = info; this.nextPtr = NULL; } // Devuelve una copia del dato del nodo template NodeType ListNode ::getData() const { return data; }

Dinamismo y Contenedores Algoritmos y Estructuras de Datos II Lista Enlazada (un ejemplo de contenedor) Definimos la clase template List: template class List { public: List(); ~List(); void insertAtFront(const NodeType &); void insertAtBack(const NodeType &); bool removeFromFront(NodeType &); bool removeFromBack(NodeType &); bool isEmpty(); private: ListNode *firstPtr; ListNode *lastPtr; //este método sirve para asignar un nuevo nodo ListNode *getNewNode(const NodeType &); };

Dinamismo y Contenedores Algoritmos y Estructuras de Datos II Lista Enlazada (un ejemplo de contenedor) // devuelve un puntero a un nodo nuevo template ListNode *List ::getNewNode(const NodeType &value) { ListNode *ptr = new ListNode (value); assert( ptr != NULL ); return ptr; } // Es una lista vacía? template bool List ::isEmpty() { return (firstPtr == NULL); } // constructor por defecto template List ::List() { firstPtr = NULL; lastPtr = NULL; }

Dinamismo y Contenedores Algoritmos y Estructuras de Datos II Lista Enlazada (un ejemplo de contenedor) // destructor template List ::~List() { if ( ! isEmpty() ) { ListNode *tmpPtr, *currentPtr ; currentPtr = this.firstPtr; while ( currentPtr != NULL ) { tmpPtr = currentPtr; currentPtr = currentPtr->nextPtr; delete tmpPtr; } //inserta un nodo al inicio de la lista template void List ::insertAtFront( const NodeType &value) { ListNode *newPtr = getNewNode( value ); if ( isEmpty() ) firstPtr = lastPtr = newPtr; else { newPtr->nextPtr = firstPtr; firstPtr = newPtr; } firstPtrlastPtr currentPtr lastPtr newPtr firstPtr

Dinamismo y Contenedores Algoritmos y Estructuras de Datos II Lista Enlazada (un ejemplo de contenedor) //inserta un nodo al final de la lista template void List ::insertAtBack( const NodeType &value) { /*ejercicio*/} //borra un nodo del comienzo de la lista template bool List ::removeFromFront(NodeType &value) { if ( isEmpty() ) return false; else { ListNode *tmpPtr = firstPtr; if ( firstPtr == lastPtr) firstPtr = lastPtr = NULL; else firstPtr = firstPtr->nextPtr; value = tmpPtr->data; delete tmpPtr; return true; } //borra un nodo del fin de la lista template void List ::removeFromBack(NodeType &value) { /*ejercicio*/} lastPtr tmpPtr firstPtr

Dinamismo y Contenedores Algoritmos y Estructuras de Datos II Tipos de constructores:  por Defecto: List(); Constructor con argumentos predeterminados: Nodo(int=3); //siempre crea un nodo con dato = 3 Node::Node(int valor) { this.dato = valor; this.nextPtr = NULL; }  por Defecto: Node(int valor); //este toma un parámetro para establecer a dato.

Dinamismo y Contenedores Algoritmos y Estructuras de Datos II  de Copia: Generan una instancia nueva, en base a una copia de la instancia pasada como parámetro. List(Const List &); Por Referencia: Genera un alias. template List ::List(Const List &lista) { this.firstPtr = lista.firstPtr; this.lastPtr = lista.lastPtr; } Por Copia: Genera una copia. template List ::List(Const List &lista) { ListNode * it = lista.firstPtr; while( it!= NULL) { this.insertAtBack(*it); it = it->nextPtr; }

Dinamismo y Contenedores Algoritmos y Estructuras de Datos II  Operador de asignación: No construye una nueva instancia, sino que reutiliza una existente. List& operator=(Const List &); Permite hacer: la = l b; //asigna a la la lista lb (puede ser por copia o referencia). ~List(); No se lo invoca explícitamente (lo invoca internamente el delete de list). Destructores: