260 likes | 413 Views
Aula 3. Listas e iteradores (cont.). 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;.
E N D
Aula 3 Listas e iteradores (cont.)
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(); ListaDeInt: interface Programação Orientada para Objectos
ListaDeInt: implementação 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; Programação Orientada para Objectos
ListaDeInt::Iterador:interface 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); Programação Orientada para Objectos
ListaDeInt::Iterador: implementação class ListaDeInt::Iterador { … private: ListaDeInt& lista_associada; int índice_do_item_referenciado; bool cumpreInvariante() const; friend class ListaDeInt; }; return -1 <= índice_do_item_referenciado; Programação Orientada para Objectos
class Aluno { public: Aluno(string const& nome = “”, int número = 0); string const& nome() const; int número() const; private: string nome_; int número_; }; Aluno::Aluno(string const& nome, int const número) : nome_(nome), número_(número) {} string const& Aluno::nome() const { return nome_; } int Aluno::número() const { return número_; } Aluno Programação Orientada para Objectos
Listas de outros tipos • Alterar • Nome da lista e respectivo construtor • Alterar typedef • Exemplo: • ListaDeInt para ListaDeAluno • typedef int Item; passa atypedef Aluno Item; Programação Orientada para Objectos
Utilização de listas int main() { ListaDeAluno lista; for(int i = 0; i != 100; ++i) { string nome; // uma só palavra! int número; cin >> nome >> número; Aluno aluno(nome, número); // Inserir por ordem… } for(ListaAluno::Iterador i = lista.primeiro(); i != lista.fim(); ++i) cout << i.item().nome() << ' ' << i.item().número() << endl; } Programação Orientada para Objectos
Inserir por ordem int main() { ListaDeAluno lista; for(int i = 0; i != 100; ++i) { string nome; // uma só palavra! int número; cin >> nome >> número; Aluno aluno(nome, número); ListaDeAluno::Iterador i = lista.primeiro(); while(i != lista.fim() and i.item().nome() < nome) ++i; lista.insereAntes(i, aluno); } for(ListaAluno::Iterador i = lista.primeiro(); i != lista.fim(); ++i) cout << i.item().nome() << ' ' << i.item().número() << endl; } Programação Orientada para Objectos
número_de_itens: int 5 índice_do_item_referenciado: int Diagrama lista : ListaDeAluno itens: Item[100] itens[0]: itens[1]: itens[2]: itens[3]: itens[4]: itens[5]: itens[6]: itens[99]: Ana 12345 Berto 11111 Carlos 22222 Duarte 33333 Xico 12121 ... i: ListaDeAluno.Iterador lista_associada: ListaDeAluno& Programação Orientada para Objectos
Cadeia simplesmente ligada class ListaDeInt { … private: … struct Elo { Item item; int seguinte; }; Elo elos[número_máximo_de_itens]; … }; Programação Orientada para Objectos
Diagrama:cadeia simplesmente ligada elos[0]: elos[13]: item: Aluno item: Aluno Ana 11111 Berto 12345 seguinte: seguinte: 13 1 Programação Orientada para Objectos
ListaDeInt::insereAntes() void ListaDeInt::insereAntes(Iterador const& iterador, Item const& item) { assert(cumpreInvariante()); assert(not estáCheia()); assert(iterador != início()); ++número_de_itens; ? assert(cumpreInvariante()); } int const elo_reservado = reservaElo(); elos[elo_reservado].item = item; elos[elo_reservado].seguinte = iterador.elo_do_item_referenciado; Programação Orientada para Objectos
Cadeia duplamente ligada class ListaDeInt { … private: … struct Elo { Item item; int anterior; int seguinte; }; … }; Programação Orientada para Objectos
Diagrama:cadeia duplamente ligada elos[45]: elos[10]: item: Aluno item: Aluno Ana 11111 Berto 12345 anterior: anterior: 33 10 seguinte: seguinte: 45 11 Programação Orientada para Objectos
ListaDeInt::insereAntes() void ListaDeInt::insereAntes(Iterador const& iterador, Item const& item) { assert(cumpreInvariante()); assert(not estáCheia()); assert(iterador != início()); ++número_de_itens; int const elo_reservado = reservaElo(); elos[elo_reservado].item = item; elos[elo_reservado].seguinte = iterador.elo_do_item_referenciado; ? assert(cumpreInvariante()); } int const anterior = elos[iterador.elo_do_item_referenciado].anterior; elos[anterior].seguinte = elo_reservado; Programação Orientada para Objectos
ListaDeInt::insereAntes():completo (I) void ListaDeInt::insereAntes(Iterador const& iterador, Item const& item) { assert(cumpreInvariante()); assert(not estáCheia()); assert(iterador != início()); ++número_de_itens; int const elo_reservado = reservaElo(); (continua) Programação Orientada para Objectos
ListaDeInt::insereAntes():completo (II) (continuação) elos[elo_reservado].item = item; elos[elo_reservado].anterior = elos[iterador.elo_do_item_referenciado].anterior; elos[elo_reservado].seguinte = iterador.elo_do_item_referenciado; int const anterior = elos[iterador.elo_do_item_referenciado].anterior; elos[anterior].seguinte = elo_reservado; elos[iterador.elo_do_item_referenciado].anterior = elo_reservado; assert(cumpreInvariante()); } Programação Orientada para Objectos
Cadeia duplamente ligada com guardas class ListaDeInt { … private: … struct Elo { Item item; int anterior; int seguinte; }; … Elo elos[número_máximo_de_itens + 2]; static int const inicial = número_máximo_de_itens; static int const final = número_máximo_de_itens + 1; … }; Programação Orientada para Objectos
ListaDeInt: construtor ListaDeInt::ListaDeInt() : número_de_itens(0) { elos[inicial].seguinte = final; elos[final].anterior = inicial; ? // falta aqui qualquer coisa... assert(cumpreInvariante()); } Programação Orientada para Objectos
ListaDeInt::remove() (I) inline void ListaDeInt::remove(Iterador& iterador) { assert(cumpreInvariante()); assert(not estáVazia()); assert(iterador != início() and iterador != fim()); --número_de_itens; int const elo_a_remover = iterador.elo_do_item_referenciado; ++iterador; // Avançar iterador! (continua) Programação Orientada para Objectos
ListaDeInt::remove() (II) (continuação) elos[elos[elo_a_remover].anterior].seguinte = elos[elo_a_remover].seguinte; elos[elos[elo_a_remover].seguinte].anterior = elos[elo_a_remover].anterior; libertaElo(elo_a_remover); assert(cumpreInvariante()); } Programação Orientada para Objectos
A fazer… • reservaElo() • libertaElo() • Saber quais os elos livres • Implementar os restantes métodos • Implementar classe Lista.Iterador Programação Orientada para Objectos
elos[0]: elos[7]: elos[10]: elos[100]: elos[101]: item: Aluno Ana 11111 anterior: anterior: anterior: anterior: anterior: 100 10 seguinte: seguinte: seguinte: seguinte: seguinte: 7 43 101 10 número_de_itens: int elo_inicial: int elo_final: int 1 100 101 primeiro_elo_livre: int 0 Diagrama:cadeia duplamente ligada com guardas Programação Orientada para Objectos
Interface vs. implementação • Alteração da implementação não implica alteração da interface • Programas que usavam Lista não precisam de ser alterados Programação Orientada para Objectos
Aula 3 • Utilização de listas • Fazendo inserções ordenadas • Melhorando a implementação das listas e iteradores: • Identificando problemas de eficiência • Noções de cadeia simplesmente ligada, cadeia duplamente ligada e cadeia duplamente ligada com guardas • Necessidade de distinguir posições livres • Implementação parcial do módulo • Reflexão sobre interfaces e implementação: • Vantagens de definir uma boa interface Programação Orientada para Objectos