Title: Cap
1(No Transcript)
2Capítulo 19
Standard Template Library
Criado por Frederick H. Colclough, Colorado
Technical University
3Objetivos 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
4Introduçã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ãopar
a 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
5Iteradores
- 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
6Manipulando 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
7Percorrendo em ciclos com Iteradores
- Lembre-se da capacidade de percorrer em
ciclosfor (pc.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
8Iteradores Utilizados com um Vector
Painel 19.1 página 551
9Tipo Iterador para Vector
- Iteradores para um vector de ints são do
tipo stdvectorltintgtiterador - Iteradores para listas de ints são do
tipo stdlistltintgtiterador - Vector está no std namespace, assim
precisamosusing stdvectorltintgtiterador
10Tipos 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
11Acesso Aleatório
Painel 19.2 página 554
12Categorias 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!
13Iteradores 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
ouenviá-lo como saída, mas não se pode mudar o - elemento no container
- Ex. p ltqualquercoisagt é ilegal!
- Iterador Mutável
- p pode ter um valor atribuído
- Modifica o elemento correspondente no container
- ex. p retorna um valor
14Iteradores Reversos
- Para percorrer em ciclos os elementos em
- ordem inversa
- Necessário um container com iteradores
bidirecionais - Pode ser consideradoiterador pfor
(pcontainer.end()p!container.begin()
p--) cout ltlt p ltlt - Mas lembre-se end() é apenas uma sentinela,
- begin() não!
- Talvez funcione em alguns sistemas, mas não
- na maioria
15Iteradores Reversos Corretos
- Para percorrer em ciclos corretamente os
- elementos na ordem inversareverse_iterador
pfor (rpcontainer.rbegin()rp!container.rend()
rp) cout ltlt rp ltlt - rbegin()
- Retorna um iterador localizado no último elemento
- rend()
- Retorna uma sentinela que marca o fim
16Problemas com Compiladores
- Alguns compiladores apresentam problemas
- Com declarações de iterador
- Considere a nossa utilizaçãousing
stdvectorltchargtiteradoriterador p - Também poderíamos utilizarstdvectorltchargtite
rador p - E outros
- Tente várias formas se tiver problemas com o
compilador
17Containers
- 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 dados - a 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
18Containers Seqüenciais
- Dispõe seus dados em uma lista
- 1o elemento, próximo elemento, até o último
- elemento
- Listas ligadas são exemplos de container
- seqüencial
- As listas ligadas que vimos eram listas ligadas
- simples
- Um link por nó
- STL não tem Listas ligadas simples
- somente listas duplamente ligadas classe
template list
19Dois Tipos de Listas
Painel 19.4 página 560
20Utilizando a Classe Template list
Painel 19.5 página 561
21Adaptadores de Container stack E queue
- Adaptadores de container são classes template
- Implementadas sobre outras classes
- ExemploA 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
- OutrasFila e Fila com prioridades
22Especificando Adaptadores de Container
- Debaixo de uma classe template adaptadora, temos
- uma classe container padrão
- Mas pode-se especificar um container-base
- diferente
- Exemplosclasse template stack? qualquer
container seqüencial - Para uma priority_queue ? o padrão é um vector
mas,poderia ser outros - Exemplo de implementaçãostackltint, vectorltintgtgt
23Containers Associativos
- Container associatvo base de dados
- muito simples
- Armazenam dados
- Cada item dado tem uma chave
- Exemplodado registro de um funcionário como
structchave Número do INSS do funcionário - Os itens são encontrados com base na chave
24Classe 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
25Mais sobre a Classe Template set
- Projetada visando a eficiência
- Armazena valores em ordem
- Pode-se especificar a ordemsetltT, Orderinggt s
- Ordering é uma relação de ordem bem-comportada
- queretorna um valor bool
- Se nenhuma ordem for especificada
- usa o operador relacional lt
26Classe Template Map
- Uma função dada como um conjunto de
- pares ordenados
- Para cada valor primeiro, no máximo um
valorsegundo no mapa - Exemplo de declaração mapmapltstring, intgt
numeroMap - Armazena em ordem, como set
- O segundo valor não precisa ter nada a ver
- com a ordem
27Eficiê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
28Algoritmos 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úcias
- do código
- A STL especifica certos detalhes sobre algoritmos
- que dão base às funções templates
- Somente certos detalhes são especificados
- São então chamados de algoritmos genéricos
29Tempo 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 entradaT(10),
T(10,000), - A Função T é chamada de tempo de execução
30Tabela para a Função Tempo de Execução
Painel 19.14 página 570
31Considerando 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
32Contando Operações
- T(N) é dado por uma fórmula, comoT(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
33Contando Operações Exemplo
- int I 0bool encontrado falsewhile (( I lt
N) ! encontrado) if (aI alvo)
encontrado true else I - 5 operações por iteração do looplt, , !, ,
, - Depois de N iterações, mais três finais lt, ,
! - Assim 6N5 operações quando o alvo não
- for encontrado
34Notação Big-O
- Lembre-se 6N5 operações no pior caso
- Expresso em notação Big-O
- Algum fator c constante onde c(6N5) é otempo
de execução atual - c é diferente em sistemas diferentes
- Dizemos que o código é executado em tempo O(6N5)
- Mas sempre consideramos os números
- mais elevados
- Termos com o expoente mais elevado
- Aqui O(N)
35Terminologia 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!
36Compararação entre Tempos de Execução
Painel 19.15 página 573
37Tempos 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
38Algoritmos 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
39Função Genérica Find
Painel 19.16 página 574
40Função Genérica Find (cont)
Painel 19.16 página 575
41Algoritmos Modificadores de Seqüência
- Funções da STL que modificam o conteúdode 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
42Algoritmos Set (Conjunto)
- Funções genéricas de operações de conjunto
- da STL
- Algoritmos genéricos pressupõem que os
- containers armazenem seus elementos
- em 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
43Algoritmos de Ordenação
- A STL contém duas funções template1- 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
44Sumá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
45Sumá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 containersque
armazenam seus dados em ordem - A STL implementa algoritmos genéricos
- Garantia de tempo de execução máximo