Post on 17-Apr-2015
1
Aula 2
Listas e iteradores
2003/2004 Programação Orientada para
Objectos2
O que é uma lista?
Exemplo:
Estudar POO Comprar prenda para o dia do pai Fazer trabalho de SO Comprar bilhete para o Rock in Rio
2003/2004 Programação Orientada para
Objectos3
Uma lista é…
Sequência de itens Ordem é relevante Ordem determinada por entidade exterior à
lista
2003/2004 Programação Orientada para
Objectos4
Operações com listas
Construir Pôr item na frente Pôr item na traseira Tirar item da frente Tirar item de trás Saber item da frente Saber item de trás
Saber comprimento Saber se está vazia Saber se está cheia
(caso exista limite) Esvaziar
2003/2004 Programação Orientada para
Objectos5
Iterador
Ferramenta para percorrer e referenciar itens em listas
Estudar POO Comprar prenda para o dia do pai Fazer trabalho de AC II Comprar bilhete para o Rock in Rio
2003/2004 Programação Orientada para
Objectos6
Operações com iteradores
Construir Saber item referenciado Passar ao próximo item Recuar para o item anterior Comparar iteradores (igualdade e diferença)
2003/2004 Programação Orientada para
Objectos7
Operações: listas e iteradores
Obter iterador primeiro Obter iterador último Inserir item antes do item referenciado pelo
iterador Remover item referenciado pelo iterador
Iterador que referencia o primeiro item da lista.
2003/2004 Programação Orientada para
Objectos8
Itens fictícios
Item inicial Item aquém da frente da lista Referenciado pelo iterador início
Item final Item além da traseira da lista Referenciado pelo iterador fim
2003/2004 Programação Orientada para
Objectos9
Exemplo
( ! 1 3 4 6 ! )
Item fictício inicial.
Item fictício final.
Itens regulares.
2003/2004 Programação Orientada para
Objectos10
Operações: listas e iteradores (actualização)
Obter iterador primeiro Obter iterador último Inserir item antes do item referenciado pelo
iterador Remover item referenciado pelo iterador Obter iterador início Obter iterador fim
2003/2004 Programação Orientada para
Objectos11
Interface das listas
class ListaDeInt { public: typedef int Item;
class Iterador;
ListaDeInt();
Item const& frente() const; Item const& trás() const;
int comprimento() const;
bool estáVazia() const; bool estáCheia() const;
void põeNaFrente(Item const& item);void põeAtrás(Item const& item);void tiraDaFrente();void tiraDeTrás();
void insereAntes(Iterador& iterador, Item const& item);void remove(Iterador& iterador);
void esvazia();
Iterador primeiro();Iterador último();Iterador início();Iterador fim();
2003/2004 Programação Orientada para
Objectos12
Classes dentro de classes
Classes embutidas Definidas dentro de uma classe envolvente Membro da classe envolvente Evitam repetições de nomes Relação íntima com classe envolvente
2003/2004 Programação Orientada para
Objectos13
Interface dos iteradores
class ListaDeInt::Iterador { public: explicit Iterador(ListaDeInt& lista_associada);
Item& item() const;
bool operator==(Iterador const& outro_iterador) const; bool operator!=(Iterador const& outro_iterador) const;
Iterador& operator++(); Iterador& operator--(); Iterador operator++(int); Iterador operator--(int);
2003/2004 Programação Orientada para
Objectos14
Mostrar itens no ecrã
ListaDeInt lista;
// Inserção de itens…
for(ListaDeInt::Iterador i = lista.primeiro(); i != lista.fim(); ++i) cout << i.item() << endl;
2003/2004 Programação Orientada para
Objectos15
Inserir por ordem
ListaDeInt lista;
// Inserção de itens…
int n;cin >> n;
ListaDeInt::Iterador i = lista.primeiro();while(i != lista.fim() and i.item() < d) ++i;
lista.insere(i, d);
2003/2004 Programação Orientada para
Objectos16
Implementação das listas
class ListaDeInt { …
private: static int const número_máximo_de_itens = 100;
Item itens[número_máximo_de_itens]; int número_de_itens;
bool cumpreInvariante() const;
friend class Iterador;};
return 0 <= número_de_itens and número_de_itens <= número_máximo_de_itens;
2003/2004 Programação Orientada para
Objectos17
Implementação dos iteradores
class ListaDeInt::Iterador {
…
private: ListaDeInt& lista_associada; int índice_do_item_referenciado;
bool cumpreInvariante() const;
friend class ListaDeInt;};
return -1 <= índice_do_item_referenciado;
2003/2004 Programação Orientada para
Objectos18
ListaDeInt: métodos (I)
inlineListaDeInt::ListaDeInt() : número_de_itens(0){ assert(cumpreInvariante());}
inline intListaDeInt::comprimento() const{ assert(cumpreInvariante());
return número_de_itens;}
inline boolListaDeInt::estáVazia() const{ assert(cumpreInvariante());
return comprimento() == 0;}
2003/2004 Programação Orientada para
Objectos19
ListaDeInt: métodos (II)
void ListaDeInt::põeNaFrente(Item const& item){ assert(cumpreInvariante()); assert(not estáCheia());
for(int i = comprimento(); i != 0; --i) itens[i] = itens[i – 1];
itens[0] = item;
++número_de_itens;
assert(cumpreInvariante());}
2003/2004 Programação Orientada para
Objectos20
ListaDeInt: métodos (III)
void ListaDeInt::tiraDeTrás(){ assert(cumpreInvariante());
assert(not estáVazia());
--número_de_itens;
assert(cumpreInvariante());}
2003/2004 Programação Orientada para
Objectos21
ListaDeInt: métodos (IV)
void ListaDeInt::insereAntes(Iterador& iterador, Item const& item){ assert(cumpreInvariante()); assert(not estáCheia()); assert(iterador != início());
for(int i = comprimento(); i != iterador.índice_do_item_referenciado; --i) itens[i] = itens[i – 1];
itens[iterador.índice_do_item_referenciado] = item;
(continua…)
2003/2004 Programação Orientada para
Objectos22
ListaDeInt: métodos (V)
(continuação)
++iterador.índice_do_item_referenciado;
assert(iterador.cumpreInvariante());
++número_de_itens;
assert(cumpreInvariante());}
2003/2004 Programação Orientada para
Objectos23
ListaDeInt: métodos (VI)
inline ListaDeInt::IteradorListaDeInt::primeiro(){ assert(cumpreInvariante());
Iterador iterador(*this);
assert(cumpreInvariante());
return iterador;}
Ou simplesmente:
inline ListaDeInt::IteradorListaDeInt::primeiro(){ assert(cumpreInvariante());
return Iterador(*this);}
2003/2004 Programação Orientada para
Objectos24
ListaDeInt: métodos (VI)
inline ListaDeInt::Iterador ListaDeInt::último(){ assert(cumpreInvariante());
Iterador iterador(*this); iterador.índice_do_item_referenciado = comprimento() – 1;
assert(iterador.cumpreInvariante()); assert(cumpreInvariante());
return iterador;}
2003/2004 Programação Orientada para
Objectos25
ListaDeInt: métodos (VII)
inline ListaDeInt::Iterador ListaDeInt::início(){ assert(cumpreInvariante());
Iterador iterador(*this); iterador.índice_do_item_referenciado = –1;
assert(iterador.cumpreInvariante()); assert(cumpreInvariante());
return iterador;}
2003/2004 Programação Orientada para
Objectos26
ListaDeInt: métodos (VIII)
inline ListaDeInt::Iterador ListaDeInt::fim(){ assert(cumpreInvariante());
Iterador iterador(*this); iterador.índice_do_item_referenciado = comprimento();
assert(iterador.cumpreInvariante()); assert(cumpreInvariante());
return iterador;}
2003/2004 Programação Orientada para
Objectos27
ListaDeInt::Iterador:métodos (I)
inline ListaDeInt::Iterador::Iterador(ListaDeInt& lista) : lista_associada(lista), índice_do_item_referenciado(0){ assert(cumpreInvariante());}
inline ListaDeInt::Iterador& ListaDeInt::Iterador::operator--(){ assert(cumpreInvariante()); assert(*this != lista_associada.início());
--índice_do_item_referenciado;
assert(cumpreInvariante());
return *this;}
2003/2004 Programação Orientada para
Objectos28
ListaDeInt::Iterador:métodos (II)
inlinebool ListaDeInt::Iterador::operator==(Iterador const& outro) const{ assert(cumpreInvariante() and outro.cumpreInvariante());
// assert(iteradores associados à mesma lista…);
return índice_do_item_referenciado == outro.índice_do_item_referenciado;}
2003/2004 Programação Orientada para
Objectos29
ListaDeInt::Iterador:métodos (III)
inlinebool ListaDeInt::Iterador::operator!=(Iterador const& outro) const{ assert(cumpreInvariante() and outro.cumpreInvariante());
// assert(iteradores associados à mesma lista…);
return índice_do_item_referenciado != outro.índice_do_item_referenciado;}
2003/2004 Programação Orientada para
Objectos30
ListaDeInt::Iterador:métodos (IV)
ListaDeInt::Item& ListaDeInt::Iterador::item(){ assert(cumpreInvariante());
assert(*this != lista_associada.início() and *this != lista_associada.fim());
return lista_associada.itens[índice_do_item_referenciado];}
2003/2004 Programação Orientada para
Objectos31
Aula 2
Noção de lista e de iterador Listas como sequências de itens com ordem
relevante Iteradores como ferramentas para percorrer e
referenciar itens em listas Operações com listas e iteradores Implementação parcial Classes embutidas