Upload
internet
View
103
Download
1
Embed Size (px)
Citation preview
Pearson Education Slide 1
Pearson Education Slide 2
Capítulo 19
Criado por Frederick H. Colclough, Colorado Technical University
Standard Template Library
Pearson Education Slide 3
Objetivos de Estudo Iteradores
Iteradores Constantes e Mutáveis Iteradores Reversos
Containers Containers Seqüenciais Adaptadores de container stack E queue
Algoritmos Genéricos Notação Big-O Algoritmos Modificadores de seqüencia,
conjunto e de ordenação
Pearson Education Slide 4
Introdução Lembre-se das estruturas de dados pilhas e filas
Construímos nossas próprias versões Existe uma grande coleção de estruturas-padrão
para guardar dados É útil se ter implementações-padrão portáteis
dessas estruturas de dados! Standard Template Library (STL)
Inclui bibliotecas para tais estruturas de dados Como as classes containers: pilhas e filas
Pearson Education Slide 5
Iteradores Lembre-se: generalização de um ponteiro
Costuma ser implementado utilizando um ponteiro!
‘Abstração’ de iteradores Projetados para ocultar detalhes da implementação Fornecem uma interface uniforme ao longo de
diferentes classes container
Cada classe container tem tipos iteradorespróprios
Assim como cada tipo dado tem seu próprio
tipo ponteiro
Pearson Education Slide 6
Manipulando Iteradores Lembre-se do uso dos operadores sobrecarregados:
++, --, ==, != *
Assim, se p for uma variável iterador, *p dá acessoaos dados apontados por p
Classe template vector Tem tudo relativo a sobrecarga Também tem os membros begin() e end()
c.begin(); //Retorna um iterador para o 1o item em c c.end(); //Retorna um valor de ‘teste’ para o final
Pearson Education Slide 7
Percorrendo em ciclos com Iteradores Lembre-se da capacidade de percorrer em
ciclos:for (p=c.begin();p!=c.end();p++)
processe *p //*p é o item dado atual Quadro Geral até aqui… Lembre-se:
Cada tipo container na STL tem seus própriostipos iteradores
Embora todos sejam utilizados da mesma forma
Pearson Education Slide 8
Iteradores Utilizados com um VectorPainel 19.1página 551
Pearson Education Slide 9
Tipo Iterador para Vector Iteradores para um vector de “ints” são do
tipo:std::vector<int>::iterador
Iteradores para listas de “ints” são do tipo:std::list<int>::iterador
Vector está no std namespace, assim precisamos:using std::vector<int>::iterador;
Pearson Education Slide 10
Tipos de Iteradores Containers diferentes Iteradores
diferentes Iteradores Vectors
Forma mais ‘geral’ Todas as operações funcionam com
iteradores
vectors Container vector bom para ilustrar
iteradores
Pearson Education Slide 11
Acesso AleatórioPainel 19.2página 554
Pearson Education Slide 12
Categorias de Iteradores Iteradores de avanço:
++ atua sobre o iterador Iteradores bidirecionais:
Ambos: ++ e -- atuam sobre o iterador Iteradores de acesso aleatório:
++, --, e de acesso aleatório funcionam com
o iterador Estas são ‘categorias’ de iteradores, não
tipos!
Pearson Education Slide 13
Iteradores Constantes e Mutáveis O comportamento do operador de desreferenciação
dita: Iterador Constante:
* Produz uma versão somente de leitura do elemento Pode-se usar *p para atribuí-lo a uma variável ou
enviá-lo como saída, mas não se pode mudar oelemento no container
Ex.: *p = <qualquercoisa>; é ilegal! Iterador Mutável:
*p pode ter um valor atribuído Modifica o elemento correspondente no container ex.: *p retorna um valor
Pearson Education Slide 14
Iteradores Reversos Para percorrer em ciclos os elementos em
ordem inversa Necessário um container com iteradores bidirecionais
Pode ser considerado:iterador p;for (p=container.end();p!=container.begin(); p--)
cout << *p << “ “ ; Mas lembre-se: end() é apenas uma ‘sentinela’,
begin() não! Talvez funcione em alguns sistemas, mas não
na maioria
Pearson Education Slide 15
Iteradores Reversos Corretos Para percorrer em ciclos corretamente
oselementos na ordem inversa:reverse_iterador p;for (rp=container.rbegin();rp!=container.rend(); rp++)
cout << *rp << “ “ ;
rbegin() Retorna um iterador localizado no último
elemento
rend() Retorna uma sentinela que ‘marca’ o fim
Pearson Education Slide 16
Problemas com Compiladores Alguns compiladores apresentam
problemas Com declarações de iterador Considere a nossa utilização:
using std::vector<char>::iterador;…iterador p;
Também poderíamos utilizar:std::vector<char>::iterador p;
E outros… Tente várias formas se tiver problemas com o compilador
Pearson Education Slide 17
Containers Classes Container da STL
Diferentes categorias de estruturas de dados Como listas, filas e pilhas
Cada uma é uma classe template com umparâmetro para um tipo específico de dadosa ser armazenado
ex.: Listas de ints, doubles ou tipos minhaClasse Cada uma tem seus próprios iteradores
Uma talvez tenha iteradores bidirecionais, outra talveztenha somente iteradores de avanço
Mas todos os operadores e membros têm o mesmo significado
Pearson Education Slide 18
Containers Seqüenciais Dispõe seus dados em uma lista
1o elemento, próximo elemento, … até o últimoelemento
Listas ligadas são exemplos de containerseqüencial
As listas ligadas que vimos eram ‘listas ligadassimples’
Um link por nó STL não tem ‘Listas ligadas simples’
somente ‘listas duplamente ligadas’: classe template list
Pearson Education Slide 19
Dois Tipos de ListasPainel 19.4 página 560
Pearson Education Slide 20
Utilizando a Classe Template listPainel 19.5
página 561
Pearson Education Slide 21
Adaptadores de Container stack E queue Adaptadores de container são classes
template Implementadas ‘sobre’ outras classes
Exemplo:A classe template stack é implementada por padrãosobre a classe template deque
Sob a implementação de uma pilha há um deque em
que residem todos os dados
Outras:Fila e Fila com prioridades
Pearson Education Slide 22
Especificando Adaptadores de Container Debaixo de uma classe template adaptadora, temos
uma classe container padrão Mas pode-se especificar um container-base
diferente Exemplos:
classe template stack qualquer container seqüencial
Para uma priority_queue o padrão é um vector mas,poderia ser outros
Exemplo de implementação:stack<int, vector<int>>
Pearson Education Slide 23
Containers Associativos Container associatvo : base de dados
muito simples Armazenam dados
Cada item dado tem uma chave Exemplo:
dado: registro de um funcionário como structchave: Número do INSS do funcionário
Os itens são encontrados com base na chave
Pearson Education Slide 24
Classe Template set Container mais simples possível Armazena elementos sem repetição 1a inserção coloca elementos no conjunto Cada elemento é sua própria chave Capacidades:
Acrescentar elementos Excluir elementos Perguntar se um elemento está no conjunto
Pearson Education Slide 25
Mais sobre a Classe Template set Projetada visando a eficiência
Armazena valores em ordem Pode-se especificar a ordem:
set<T, Ordering> s; Ordering é uma relação de ordem bem-
comportadaque:retorna um valor bool
Se nenhuma ordem for especificada: usa o operador relacional <
Pearson Education Slide 26
Classe Template Map Uma função dada como um conjunto de
pares ordenados Para cada valor primeiro, no máximo um valor
segundo no mapa Exemplo de declaração map:
map<string, int> numeroMap; Armazena em ordem, como set
O segundo valor não precisa ter nada a ver
com a ordem
Pearson Education Slide 27
Eficiência A STL foi projetada tendo a eficiência como
um de seus objetivos mais importantes Visam a excelência
Exemplo: os elementos em set e map sãoarmazenados em ordem para buscas mais
rápidas Funções-membros das classes templates:
Tempo máximo de execução assegurado Chamado notação ‘Big-O’. Um índice de ‘eficiência’
Pearson Education Slide 28
Algoritmos Genéricos Funções templates básicas Lembre-se da definição de algoritmo
Conjunto de instruções para executar uma tarefa Pode ser representado em qualquer linguagem Geralmente imaginado em ‘pseudocódigo’ Considerado uma ‘abstração’ do código
Fornece detalhes importantes, mas não as minúciasdo código
A STL especifica certos detalhes sobre algoritmosque dão base às funções templates
Somente certos detalhes são especificados São então chamados de ‘algoritmos genéricos’
Pearson Education Slide 29
Tempo de Execução Quão rápido é o programa?
‘Segundos’? Considere: grandes ou pequenas entradas?
Produzindo uma ‘tabela’ Baseada no tamanho da entrada A tabela é chamada de ‘função’ em matemática
Com argumentos e valores de retorno! O argumento é o tamanho da entrada:
T(10), T(10,000), … A Função T é chamada de ‘tempo de execução’
Pearson Education Slide 30
Tabela para a Função Tempo de Execução
Painel 19.14 página 570
Pearson Education Slide 31
Considerando um Programa de Ordenação
Mais rápido com um conjunto de dados de
entrada menores? Talvez Talvez dependa do ‘estado’ do conjunto
‘Na maioria das vezes’ já ordenado?
Considere o pior caso de tempo de execução T(N) é o tempo levado com a lista ‘mais difícil’
A lista que leva o maior tempo para se ordenar
Pearson Education Slide 32
Contando Operações T(N) é dado por uma fórmula, como:
T(N) = 5N + 5 “Em entradas de tamanho N o programa
levará
5N + 5 unidades de tempo” Deve ser ‘independente do computador’
usado Não importa quão ‘rápido’ os computadores
são Não podemos estimar o ‘tempo’ Em vez disso, contamos as ‘operações’
Pearson Education Slide 33
Contando Operações: Exemplo int I = 0;
bool encontrado = false;while (( I < N) && ! encontrado)
if (a[I] == alvo) encontrado = true;
elseI++;
5 operações por iteração do loop:<, &&, !, [ ], ==, ++
Depois de N iterações, mais três finais: <, &&, ! Assim: 6N+5 operações quando o alvo não
for encontrado
Pearson Education Slide 34
Notação Big-O Lembre-se: 6N+5 operações no ‘pior caso’ Expresso em notação ‘Big-O’
Algum fator ‘c’ constante onde c(6N+5) é otempo de execução atual
c é diferente em sistemas diferentes Dizemos que o código é executado em tempo
O(6N+5) Mas sempre consideramos os ‘números
mais elevados’ Termos com o expoente mais elevado
Aqui: O(N)
Pearson Education Slide 35
Terminologia Big-O Tempo de execução linear:
O(N) – diretamente proporcional ao tamanho
da entrada N Tempo de execução quadrático:
O(N2) Tempo de execução lagorítmico:
O(log N) Tipicamente ‘logarítmo de base 2’ Algorítmos muito rápidos!
Pearson Education Slide 36
Compararação entre Tempos de Execução
Painel 19.15página 573
Pearson Education Slide 37
Tempos de Execução no Acesso a Containers
O(1) – Operação sempre constante: Inserções ao final ou na frente de um vector Inserções em um deque Inserções em uma lista
O(N) Inserção ou eliminação de um elemento
arbitrário
em um vector ou deque (N é o número de elementos)
O(log N) Encontrar algo em um set ou map
Pearson Education Slide 38
Algoritmos Não-modificadores de Seqüência
Funções templates que atuam sobre
containers NÃO modificam o conteúdo dos containers
Função genérica find Exemplo típico pode ser utilizada com quaisquer classes
containers seqüenciais da STL
Pearson Education Slide 39
Função Genérica FindPainel 19.16página 574
Pearson Education Slide 40
Função Genérica Find (cont)Painel 19.16 página 575
Pearson Education Slide 41
Algoritmos Modificadores de Seqüência Funções da STL que modificam o conteúdo
de um container Lembre-se: acrescentar ou remover um
elemento de um container pode afetar
quaisquer dos outros iteradores! list e slist garantem que nenhuma mudança
será efeutada vector e deque não dão tal garantia
Sempre preste atenção quais iteradores são seguros para serem modificados/não-modificados
Pearson Education Slide 42
Algoritmos Set (Conjunto) Funções genéricas de operações de conjunto
da STL Algoritmos genéricos pressupõem que os
containers armazenem seus elementosem ordem
Containers set, map, multiset e multimap Armazenam dados em ordem, assim, todas as
funções se aplicam Outros, como vector, não são ordenados
Essas funções não devem ser utilizadas
Pearson Education Slide 43
Algoritmos de Ordenação A STL contém duas funções template:
1- ordena um intervalo de elementos2- intercala dois intervalos de elementos
ordenados Garantem um tempo de execução de O(N log N)
Nenhuma ordenação pode ser mais rápida Essa função garante que o algoritmo de
ordenação
é o mais rápido possível
Pearson Education Slide 44
Sumário 1 Iterador é uma ‘generalização’ de um ponteiro
Usado para se mover através dos elementos de um
container Classes container com iteradores têm:
Funções-membros end() e begin() que retornam valores
de iteradores tais que podem processar todos os dados
no container Principais tipos de iteradores:
Avanço, bidirecional e de acesso aleatório Dado o iterador constante p, *p é uma versão
somente de leitura do elemento
Pearson Education Slide 45
Sumário 2 Dado o iterador mutável p *p pode ter um valor
atribuído Um container bidirecional possui iteradores reversos
que permitem a seu código percorrer em ciclos Containers principais na STL: list, vector e deque
Pilha e fila: classes container adaptadoras set, map, multiset e multimap são containers
que armazenam seus dados em ordem A STL implementa algoritmos genéricos
Garantia de tempo de execução máximo