Tema 4 –Genericidad - Presentación - Universidad de...

61
Tema 4 – Genericidad Programación Orientada a Objetos Curso 2010/2011

Transcript of Tema 4 –Genericidad - Presentación - Universidad de...

Tema 4 – Genericidad

Programación Orientada a ObjetosCurso 2010/2011

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.