Tema 4 –Genericidad - Presentación - Universidad de...
-
Upload
nguyenphuc -
Category
Documents
-
view
215 -
download
0
Transcript of Tema 4 –Genericidad - Presentación - Universidad de...
Curso 2010/2011 Programación Orientada a Objetos 2
Contenido
� Genericidad en Java.
� Colecciones en Java.
� Genericidad en C++.
� Colecciones en C++.
Curso 2010/2011 Programación Orientada a Objetos 3
Genericidad en Java
� Facilidad de un lenguaje de programación para definir clases parametrizadas con tipos de datos.
� Resultan de utilidad para la implementación de tipos de datos contenedores como las colecciones.
� La genericidad sólo tiene sentido en lenguajes con comprobación estática de tipos , como Java.
� La genericidad permite escribir código reutilizable .
Curso 2010/2011 Programación Orientada a Objetos 4
Clase Contenedor
public class Contenedor<T> {
private T contenido ;
public void setContenido(T contenido) {
this . contenido = contenido;
}
public T getContenido() {
return contenido;
}
}
Curso 2010/2011 Programación Orientada a Objetos 5
Genericidad
� La parametrización de una clase genérica se realiza en la
declaración de una variable y en la construcción .
Contenedor<String> contenedor =
new Contenedor<String>();
contenedor.setContenido( "hola" );
Curso 2010/2011 Programación Orientada a Objetos 6
Operaciones sobre tipos genéricos
� Podemos aplicar la asignación (=) y la comparación de identidad (== o !=).
� También las operaciones aplicables sobre cualquier objeto (métodos de la clase Object )
� Dentro de la clase genérica, no es posible construir objetos de un tipo genérico :� T contenido = new T(); // No compila
� Es posible aplicar más operaciones aplicando genericidad restringida .
Curso 2010/2011 Programación Orientada a Objetos 7
Genericidad
� Una clase genérica es una clase normal, salvo que dentro de su declaración utiliza un tipo variable (parámetro), que será definido cuando sea utilizada.
� Dentro de una clase genérica se pueden utilizar otras clases genéricas.
� Una clase genérica puede tener varios parámetros.
public class ContenedorDoble <T,K> {
private String nombre ;
private Contenedor<T> clave ;
private K valor ; … }
ContenedorDoble<String, Cuenta> contenedor = …
Curso 2010/2011 Programación Orientada a Objetos 8
Genericidad y tipos primitivos
� Las clases genéricas no pueden ser parametrizadas a tipos primitivos .
� Para resolver este problema el lenguaje define clases envoltorio de los tipos primitivos:
� Integer , Float , Double , Character , Boolean , etc.
� El compilador transforma automáticamente tipos primitivos en clases envoltorio y viceversa: autoboxing .
Contenedor<Integer> contenedor =
new Contenedor<Integer>();
contenedor.setContenido(10);
int valor = contenedor.getContenido();
Curso 2010/2011 Programación Orientada a Objetos 9
Genericidad restringida
� Objetivo : limitar los tipos a los que puede ser parametrizada una clase genérica.
� Al restringir los tipos obtenemos el beneficio de poder aplicar métodos sobre los objetos de tipo genérico.
� Una clase con genericidad restringida sólo permite ser parametrizada con tipos compatibles con el de la restricción (clase o interfaz).
Curso 2010/2011 Programación Orientada a Objetos 10
Genericidad restringida
public class CarteraAhorro<T extends Deposito> {
private LinkedList<T> contenido ;
public void liquidar() {
for (T deposito : contenido)
deposito.liquidar();
}…
}
� La clase CarteraAhorro sólo puede ser parametrizada con tipos compatibles con Deposito .
� Podemos aplicar métodos disponibles en la clase Deposito .
Curso 2010/2011 Programación Orientada a Objetos 11
Genericidad restringida
� Una clase genérica puede estar restringida por varios tipos :
� Por tanto, las operaciones disponibles para objetos de tipo T son las de todos los tipos.
public class Contenedor<T extends Deposito & Amortizable>
Curso 2010/2011 Programación Orientada a Objetos 12
Genericidad y herencia
� Una clase puede heredar de una clase genérica .� La nueva clase tiene las opciones :
� Mantener la genericidad de la clase padre.
� Restringir la genericidad .
� No ser genérica y especificar un tipo concreto .
public class CajaSeguridad<T> extends Contenedor<T>
public class CajaSeguridad<T extends Valorable>
extends Contenedor<T>
public class CajaSeguridad extends Contenedor<Valorable>
Curso 2010/2011 Programación Orientada a Objetos 13
Genericidad y sistema de tipos
Deposito
DepositoEstructurado
Contenedor<Deposito >
Contenedor<DepositoEstructurado >
No hay relación
Contenedor<Deposito> cDeposito;
Contenedor<DepositoEstructurado> cEstructurado;
…
cDeposito = cEstructurado; // No compila
Curso 2010/2011 Programación Orientada a Objetos 14
Genericidad y sistema de tipos
� Cuando se declara una variable cuyo tipo se corresponde con una clase genérica y no se especifica el parámetro se asigna el tipo puro (raw) que corresponde a:� Sin genericidad restringida, la clase Object .
� Con genericidad restringida, la clase a la que se restringe.
� Siendo:� Clase Contenedor<T>
� Clase CarteraAhorro<T extends Deposito>
Contenedor contenedor = new Contenedor(); // Object
CarteraAhorro cartera = new CarteraAhorro(); // Deposito
Curso 2010/2011 Programación Orientada a Objetos 15
Genericidad y tipos comodín
� El método sólo permite objetos de tipo List<Deposito> .
� ¿Cómo podemos pasar un lista de depósitos estructurados?
public double posicionGlobal(List<Deposito> depositos) {
double posicion = 0;
for (Deposito deposito : depositos) {
posicion += deposito.getCapital();
}
return posicion;
}
Curso 2010/2011 Programación Orientada a Objetos 16
Genericidad y tipos comodín
� Se utiliza un comodín , que significa: permite cualquier lista genérica parametrizada a la clase Depósito o a un tipo compatible (subclase).
� Si pasamos como parámetro un objeto List<DepositoEstructurado> , éste será el tipo reconocido dentro del método.
� El tipo comodín se puede usar para declarar variables locales o atributos.
� No se puede utilizar el tipo comodín para construir objetos.
public double posicionGlobal(
List<? extends Deposito> depositos)
Curso 2010/2011 Programación Orientada a Objetos 17
Genericidad y máquina virtual
� La máquina virtual no maneja objetos de tipo genéri co .
� En tiempo de ejecución se pierde la información sobre el tipo utilizado para parametrizar la clase genérica.
� Todo tipo genérico (clase genérica parametrizada) se transforma a un tipo puro .
� Con el operador instanceof sólo podemos preguntar por el nombre de la clase.
// No compila
if (contenedor instanceof Contenedor<Deposito>) { … }
// Sí compila
if (contenedor instanceof Contenedor) { … }
Curso 2010/2011 Programación Orientada a Objetos 18
Genericidad basada en Object
� La genericidad fue introducida en Java a partir de la versión 5.
� Antes de esa versión, las clases genéricas se definían utilizando el tipo Object en lugar de un tipo genérico.
� Una referencia de tipo Object puede referenciar a cualquier objeto.
� Este modelo está en desuso, aunque aún existe código que trabaja con la genericidad basada en Object .
Curso 2010/2011 Programación Orientada a Objetos 19
Genericidad basada en Object
public class Contenedor {
private Object contenido ;
public void setContenido(Object contenido) {
this . contenido = contenido;
}
public Object getContenido() {
return contenido;
}
}
Curso 2010/2011 Programación Orientada a Objetos 20
Genericidad basada en Object
� El compilador no ayuda en el control de tipos.
� El uso correcto de los tipos queda en manos del programador.� Para extraer objetos es necesario hacer siempre un casting
que podría fallar.
Contenedor contenedor =
new Contenedor ();
contenedor.setContenido( "hola" );
Deposito d = (Deposito)contenedor.getContenido();
// Error de casting en tiempo de ejecución.
Curso 2010/2011 Programación Orientada a Objetos 21
Seminario 3
� En el Seminario 3 se incluye un apartado que trata la genericidad.
� Se incluyen los siguientes ejemplos :� Genericidad basada en Object .
� Definición de una clase genérica.
� Genericidad restringida.
Curso 2010/2011 Programación Orientada a Objetos 22
Colecciones en Java
� Las colecciones en Java son un ejemplo destacado de implementación de código reutilizable utilizando un lenguaje orientado a objetos.
� Todas las colecciones son genéricas .
� Los tipos abstractos de datos se definen como interfaces .
� Se implementan clases abstractas que permiten factorizar el comportamiento común a varias implementaciones.
� Un mismo TAD puede ser implementado por varias clases � List : LinkedList , ArrayList
Curso 2010/2011 Programación Orientada a Objetos 23
Colecciones en Java. Paquete java.util
Collection
ListIterator
Iterator Map
AbstractMapSortedMap
AbstractSequentialList
TreeMap HashMapSortedSet
AbstractSetAbstractList
AbstractCollection
SetList
HashSet TreeSet
ArrayList
extends
implements
class
interface
devuelve
devuelve
devuelve
LinkedList
Curso 2010/2011 Programación Orientada a Objetos 24
Interfaz Collection<T>
� Define las operaciones comunes a todas las colecciones de Java.
� Permite manipular colecciones basándonos en su interfaz en lugar de en la implementación.
� Los tipos básicos de colecciones son:
� Listas, definidas en la interfaz List<T>
� Conjuntos, definidos en la interfaz Set<T>
Curso 2010/2011 Programación Orientada a Objetos 25
Interfaz Collection<T>
� Operaciones básicas :� size () : devuelve el número de elementos.
� isEmpty (): indica si tiene elementos.
� add (T e): añade un elemento a la colección.
� Retorna un booleano indicando si acepta la inserción.
� remove (Object e): intenta eliminar el elemento.
� Retorna un booleano indicando si ha sido eliminado.
� clear (): elimina todos los elementos.
� contains (Object e): indica si contiene el objeto
pasado como parámetro.
Curso 2010/2011 Programación Orientada a Objetos 26
Interfaz List<T>
� La interfaz List<T> define secuencias de elementos a los que se puede acceder atendiendo a su posición.
� Las posiciones van de 0 a size()-1 .� El acceso a una posición ilegal produce la excepción
IndexOutOfBoundsException
� El método add (T e) añade al final de la lista.� Añade a las operaciones de Collection métodos de
acceso por posición como:� T get (int index)� T set (int index, T element)� void add (int index, T element)� T remove (int index)
Curso 2010/2011 Programación Orientada a Objetos 27
� ArrayList<T>
� Implementación basada en arrays redimiensionables .� Operaciones de inserción y modificación ineficientes.� Operaciones de creación y consulta rápidas.
� LinkedList<T>
� Implementación basada en listas doblemente enlazadas� Inserciones y modificaciones rápidas, especialmente en el
principio y el final:� addFirst, addLast, removeFirst, removeLast
� Acceso aleatorio a elementos ineficiente� Acceso eficiente al principio y al final de la lista:
� getFirst y getLast
Implementaciones de Listas
Curso 2010/2011 Programación Orientada a Objetos 28
Ejemplo uso de listas
import java.util.List;import java.util.LinkedList;
public class Persona {private final String dni ;private String nombre ;private LinkedList<ProductoFinanciero> productosContratados ;
public Persona(String dni, String nombre){this . dni = dni;this . nombre = nombre;productosContratados =
new LinkedList<ProductoFinanciero>();}
Curso 2010/2011 Programación Orientada a Objetos 29
Ejemplo uso de listas
public void addProducto(ProductoFinanciero producto){productosContratados .add(producto);
}
public void removeProducto(ProductoFinanciero producto){productosContratados .remove(producto);
}
public List<ProductoFinanciero> getProductosContratados(){return new LinkedList<ProductoFinanciero>(
productosContratados );}}
� Se debe utilizar el tipo de la interfaz como valor de retorno.
� Todas las colecciones disponen del constructor de copia .
Curso 2010/2011 Programación Orientada a Objetos 30
Conjuntos: Set<T> y SortedSet<T>
� La interfaz Set<T> define conjuntos de elementos no repetidos.
� Para evitar la inserción de elementos repetidos, la igualdad de los objetos se comprueba con equals .
� La interfaz SortedSet<T> extiende Set<T> con la funcionalidad para conjuntos de elementos ordenados� Los métodos first y last devuelven el primer y el último
elemento de acuerdo a la relación de orden.
� También proporciona métodos para obtener subconjuntos:� SortedSet<T> headSet (T toElement)
� SortedSet<T> tailSet (T fromElement)
� SortedSet<T> subSet (T fromElement ,T toElement)
Curso 2010/2011 Programación Orientada a Objetos 31
Implementaciones de conjuntos
� Implementaciones de conjuntos:� HashSet<T> guarda los elementos del conjunto
en una tabla hash.� TreeSet<T> implementación de conjuntos
ordenados basada en árboles binarios balanceados.� Implementa la interfaz SortedSet<T>
� Las operaciones de búsqueda y modificación son más lentas en TreeSet que en HashSet
Curso 2010/2011 Programación Orientada a Objetos 32
Mapas: Map<K,V> y SortedMap<K,V>
� La interfaz Map<K,V> define el tipo de datos que representa pares <clave, valor>� Un mapa no puede tener claves duplicadas.� Cada clave sólo puede tener un valor asociado.
� La interfaz SortedMap<K,V> extiende la interfaz Map<K,V>para proporcionar la funcionalidad de mapas ordenados por claves.� Las operaciones son análogas a las de la interfaz SortedSet
considerando el conjunto de claves.� firstKey y lastKey : primera y última clave
� SortedMap<K,V> headSet (T toKey)
� SortedMap<K,V> tailSet (T fromKey)
� SortedMap<K,V> subSet (T fromKey ,T toKey)
Curso 2010/2011 Programación Orientada a Objetos 33
Mapas: Map<K,V> y SortedMap<K,V>
� Un mapa no es una colección, sin embargo contiene distintas colecciones:� Conjunto de claves (Set<K> )� Colección de valores (Collection<V> )� Conjunto de pares <clave, valor> (Set<Map.Entry<K,V>> )
� Las implementaciones disponibles son:� HashMap<T>: implementación basada en una tabla hash� TreeMap<T> : implementación basada en árboles
balanceados.� Las claves están ordenadas (SortedSet<K> ).
Curso 2010/2011 Programación Orientada a Objetos 34
Interfaz Map<K,V>
� Métodos básicos :� V put (K clave, V valor) : inserta una asociación en el
mapa.� Retorna el valor de la antigua asociación, si la hubiera.
� V get (clave): retorna el valor asociado a una clave.� Si la asociación no existe, devuelve nulo.
� Set<K> keySet (): devuelve el conjunto de claves.� Collection<V> values (): devuelve la colección de valores.� boolean containsKey (key): indica si existe una clave.� Set<Map.Entry<K, V>> entrySet (): devuelve el conjunto
de todas las asociaciones, Map.Entry<K, V> :� getKey(): consultar la clave.
� getValue(): consultar el valor.
Curso 2010/2011 Programación Orientada a Objetos 35
Ejemplo clase Sucursal
public class Sucursal {private int codigo ;private String direccion ;private HashMap<Persona,
LinkedList<ProductoFinanciero>> pasivo ;
public Sucursal( int codigo, String direccion){this . codigo = codigo;this . direccion = direccion;pasivo = new HashMap<Persona,
LinkedList<ProductoFinanciero>>();}public void addContrato(Persona cliente,
ProductoFinanciero producto) {…public Set<Persona> getClientes(){…public Set<ProductoFinanciero> getProductosContratados(){…
}
Curso 2010/2011 Programación Orientada a Objetos 36
Ejemplo clase Sucursal
public void addContrato(Persona cliente,ProductoFinanciero producto)
{LinkedList<ProductoFinanciero> productos;
if (! pasivo .containsKey(cliente)) {productos = new LinkedList<ProductoFinanciero>();pasivo .put(cliente, productos);
}else productos = pasivo .get(cliente);
productos.add(producto);
}
Curso 2010/2011 Programación Orientada a Objetos 37
Ejemplo clase Sucursal
public Set<Persona> getClientes(){return new HashSet<Persona>( pasivo .keySet());
}
public Set<ProductoFinanciero> getProductosContratados(){Collection<LinkedList<ProductoFinanciero>> producto s;productos = pasivo .values();Set<ProductoFinanciero> cjtoProductos =
new HashSet<ProductoFinanciero>();
for (LinkedList<ProductoFinanciero> lista : productos)cjtoProductos.addAll(lista);
return cjtoProductos;}
Curso 2010/2011 Programación Orientada a Objetos 38
Orden de los objetos� El orden utilizado por las colecciones ordenadas
(SortedSet, SortedMap ) puede ser el orden naturalde los objetos (por defecto) o el criterio de ordenaciónque se establece en el constructor.
� La interfaz Comparable impone el orden natural de los objetos de las clases que la implementan.
� El método compareTo devuelve un entero positivo si la relación es “mayor que”, negativo si es “menor que” y cero si son iguales.
public interface Comparable<T> {
public int compareTo(T o);
}
Curso 2010/2011 Programación Orientada a Objetos 39
Orden natural de Cuenta
public class Cuenta implements Comparable<Cuenta>{ …public int compareTo(Cuenta otraCta) {
if ( this . codigo > otraCta. codigo )
return 1;
else if ( this . codigo < otraCta. codigo )
return -1;
else return 0;}
}
Curso 2010/2011 Programación Orientada a Objetos 40
TreeSet<Cuenta> orden natural
public class Persona {…private TreeSet<Cuenta> misCuentas ;
public Persona(String dni, String nombre){…//TreeSet utiliza el orden natural de la clase Cuent amisCuentas = new TreeSet<Cuenta>();
}
/*** Añade una cuenta a la colección de la persona que es titular* @param cta Cuenta a añadir en la colección* @return true si la cuenta se ha añadido y false en caso contr ario*/
public boolean addCuenta(Cuenta cta){return misCuentas .add(cta);
}}
Curso 2010/2011 Programación Orientada a Objetos 41
Criterios de ordenación
� Para definir un criterio de ordenación hay que implementar la interfaz Comparator .
� El método compare devuelve un entero positivo si la relación es “mayor que”, negativo si es “menor que” y cero si son iguales.
public interface Comparator<T> {
public int compare(T o1, T o2);
}
Curso 2010/2011 Programación Orientada a Objetos 42
Criterios de ordenación para Cuentapublic class OrdenSaldo implements Comparator<Cuenta>{
public int compare(Cuenta o1, Cuenta o2) {if (o1.getSaldo() > o2.getSaldo())
return 1;else if (o1.getSaldo() < o2.getSaldo())
return -1;else
return 0;}
}
public class OrdenTitular implements Comparator<Cuenta>{public int compare(Cuenta o1, Cuenta o2) {
return ( o1.getTitular().getNombre().compareTo(o1.getTitular().getNombre()));
}}
Curso 2010/2011 Programación Orientada a Objetos 43
TreeSet<Cuenta> con criterio de ordenación
public class Persona {…
private TreeSet<Cuenta> misCuentas ;
public Persona(String dni, String nombre){…
misCuentas = new TreeSet<Cuenta>( new OrdenTitular ());
//TreeSet utiliza el orden establecido //en la clase OrdenTitular para ordenar las cuentas
}
}
Curso 2010/2011 Programación Orientada a Objetos 44
Iteradores
� Las colecciones de Java son iterables, es decir, podemos recorrer todos sus elementos.
� Se utilizan iteradores para que el código que realiza el recorrido no conozca las particularidades de la estructura de datos: lista enlazada, lista basada en arrays, etc.
public double posicionGlobal(List<Deposito> depositos) {
double posicion = 0;
for (Deposito deposito : depositos) {
posicion += deposito.getCapital();
}
return posicion;
}
Curso 2010/2011 Programación Orientada a Objetos 45
Iteradores
� Java proporciona la interfaz Iterable<T> que debe ser implementada por aquellas clases sobre las que se pueda iterar:
� A los objetos iterables se les exige que creen objetos iterador (Iterator ) para realizar la iteración.
� Los arrays y la interfaz Collection son iterables.
public interface Iterable<T> {
Iterator<T> iterator();
}
Curso 2010/2011 Programación Orientada a Objetos 46
Iteradores
� Interfaz Iterator<T> :
� hasNext () : indica si quedan elementos en la iteración.
� next () : devuelve el siguiente elemento de la iteración.
� remove () : elimina el último elemento devuelto por el iterador.
public interface Iterator<T> {
boolean hasNext();
T next();
void remove();
}
Curso 2010/2011 Programación Orientada a Objetos 47
Recorrido for each
� El recorrido for each permite recorrer objetos iterables sin manejar un objeto iterador.
� Es la opción más común de recorrido.
public double posicionGlobal(List<Deposito> depositos) {
double posicion = 0;
for (Deposito deposito : depositos) {
posicion += deposito.getCapital();
}
return posicion;
}
Curso 2010/2011 Programación Orientada a Objetos 48
Recorrido explícito con iterador
� Interesa manejar un iterador cuando queremos eliminar algún elemento de la colección.� En Java sólo se puede modificar una colección que se está
recorriendo utilizando el iterador.
public double filtrar(List<Deposito> depositos) {
Iterator<Deposito> it = depositos.iterator();
while (it.hasNext()) {
Deposito deposito = iterator.next();
if (deposito.getCapital() < 1000)
it.remove();
}
}
Curso 2010/2011 Programación Orientada a Objetos 49
Genericidad en C++
� La clases genéricas en C++ se conocen como templates .
� Ejemplo: Contenedor
template <class T> class Contenedor {
private :
T contenido ;
public :
T getContenido ();
void setContenido ( T elem);
};
Curso 2010/2011 Programación Orientada a Objetos 50
Genericidad – Implementación
� La implementación de la clase genérica debe realizarse en el fichero de cabecera :
template <class T> T Contenedor<T>::getContenido (){
return contenido;
}
template <class T> void Contenedor<T>::setContenido ( T elem){
contenido = elem;
}
Curso 2010/2011 Programación Orientada a Objetos 51
Genericidad – Uso
� Se indica el tipo de la clase genérica en su declaración.
� Puede ser aplicada a tipos primitivos.
Persona * titular = new Persona( "juan" , "34914680" );
Cuenta * cuenta = new Cuenta(titular);
Contenedor <Cuenta *> contenedor;
contenedor.setContenido(cuenta);
Cuenta * cta = contenedor.getContenido();
Contenedor<int> cEntero;
cEntero.setContenido(10);
Curso 2010/2011 Programación Orientada a Objetos 52
Genericidad – Críticas
� C++ no implementa un auténtico sistema de genericidad .
� Cuando se usa una clase genérica, se realiza un reemplazo del texto del parámetro en la declaración de la clase.
� Por tanto, se genera código para cada uno de los tipos a los que se instancie la clase genérica .
Curso 2010/2011 Programación Orientada a Objetos 53
Genericidad restringida
� No se puede restringir la genericidad.
� Está permitido aplicar cualquier método y operador
sobre las entidades del tipo genérico (tipo T en el
ejemplo).
� Es problemático determinar la sintaxis de los mensajes ,
ya que se puede instanciar a tipos por valor o referencia.
� Si la operación no está disponible sobre el tipo genérico, el
error será detectado en tiempo de compilación.
Curso 2010/2011 Programación Orientada a Objetos 54
Colecciones en C++
� Todas las entidades de la Librería Estándar C++ se han incluido en un único espacio de nombres denominado std .
� La librería estándar de plantillas, o STL (Standard Template Library), implementa un conjunto de estructuras de datos y algoritmos que conforman una parte sustancial de la Librería Estándar C++.
� Las estructuras de datos genéricas se denominan contenedores .
� Los contenedores son clases genéricas (template ) pensadas para contener cualquier tipo de objeto.
� No existe un contenedor común raíz de la jerarquía.
Curso 2010/2011 Programación Orientada a Objetos 55
Tipos de colecciones
� Existen dos tipos de contenedores:
� Secuencias:� Almacenan los elementos en orden secuencial.� Adecuadas para accesos directos y secuenciales.� vector , list , deque (cola de doble terminación),
stack
� Asociaciones:� Almacenan pares de valores <clave, valor>.� Podría verse como una array en el que el índice no tiene
por qué ser un entero.� Adecuados para accesos aleatorios mediante claves. � map, set
Curso 2010/2011 Programación Orientada a Objetos 56
Cuenta.h
#include <list>using namespace std;
class Cuenta {public :
…list <double >* getOperaciones () const ;
private :…list <double >* operaciones ;void anotarOperacion ( double cantidad);
};
Curso 2010/2011 Programación Orientada a Objetos 57
Cuenta.cpp
Cuenta::Cuenta ( Persona * persona, double saldoInicial){…operaciones = new list <double >();
}
list <double >* Cuenta::getOperaciones () const {return new list <double >(* operaciones );
}
void Cuenta::anotarOperacion ( double cantidad){operaciones ->push_back(cantidad);
}
Curso 2010/2011 Programación Orientada a Objetos 58
Prueba de listasint main () {
…Cuenta * cuenta = new Cuenta(titular); cuenta->ingreso(100);cuenta->reintegro(300);cuenta->ingreso(1000);list <double >* movimientos;
movimientos = cuenta->getOperaciones();
list <double >:: const_iterator it;it = movimientos->begin();for (; it != movimientos->end() ;++it)
cout << (*it) << endl;
exit (0);}
Curso 2010/2011 Programación Orientada a Objetos 59
Prueba de listas
� La implementación de las listas no ofrece métodos para accesos aleatorios porque serían ineficientes.
� Sólo dispone de métodos de acceso al principio y al final� Se puede utilizar de forma efectiva como una pila
� Para recorrer las listas se utilizan iteradores.
Curso 2010/2011 Programación Orientada a Objetos 60
Prueba con vectoresint main () {
…Cuenta * cuenta = new Cuenta(titular); cuenta->ingreso(100);cuenta->ingreso(300);cuenta->reintegro(300);cuenta->ingreso(1000);vector <double >* movimientos;
movimientos = cuenta->getOperaciones();
for ( int i = 0; i < movimientos->size(); i++)cout << (*movimientos)[i] <<endl;
exit (0);}
Curso 2010/2011 Programación Orientada a Objetos 61
Prueba con vectores
� Los vectores se utilizan como arrays de tamaño fijo.
� Aunque tiene operaciones para aumentar el tamaño del vector se desaconseja su uso por ser ineficientes.
� Acceso fácil y eficiente a los elementos.
� size() no devuelve el número de elementos sino el tamaño del vector.