Estruturas de Dados - STL Baseada na apresentação do prof. João Bittencourt Leandro Tonietto ltonietto@unisinos.br Algoritmos e Estruturas de Dados em C++ Unisinos http://www.inf.unisinos.br/~ltonietto/jed/aed/estruturadados-stl.pdf mai-09
STL - Standard Template Library Biblioteca Padrão de Gabaritos de C++ Desenvolvida por Alexander Stepanov e Meng Lee na HP. Tornou-se padrão no C++ Possui uma série de estruturas de dados, iteradores e algoritmos padrões. Evita-se reinventar a roda O programador pode apropriar-se das classes da STL para criar seus sistemas 6-mai-09 Leandro Tonieto 2
Pilhas com STL: Incluir biblioteca stack: #include <stack> Usar classe stack com tipo de pilha a ser utilizado (esquema de templates): stack<int> pilha; stack<movimento> undo; stack<movimento> redo; 6-mai-09 Leandro Tonieto 3
Pilhas com STL, métodos: Inserir um elemento no topo da pilha push() Remover elemento do topo pop() Não retorna o elemento removido Obter elemento no topo da pilha top() Retorna o elemento sem removê-lo Verifica se a pilha está vazia empty() Tamanho atual da pilha size() :: exemplo :: 6-mai-09 Leandro Tonieto 4
Exercício com stack: Estruturas de dados - STL Faça o exercício de palíndromo utilizando pilhas da STL (stack). O programa deve solicitar a digitação de uma frase por parte do usuário e verificar se a palavra é um palíndromo. 6-mai-09 Leandro Tonieto 5
Filas com STL: Incluir biblioteca queue: #include <queue> Estruturas de dados - STL Usar classe queue com tipo de fila a ser utilizado (esquema de templates): queue<int> fila; 6-mai-09 Leandro Tonieto 6
Filas com STL, métodos: Inserir um elemento no final da fila push() Remover elemento da fila pop() Não retorna o elemento removido Obter elemento na frente da fila front() Retorna o elemento sem removê-lo Verifica se a fila está vazia empty() Tamanho atual da fila size() :: exemplo :: 6-mai-09 Leandro Tonieto 7
Filas com prioridade (PRIQ) com STL: Incluir biblioteca queue: #include <queue> Usar classe priority_queue com tipo de fila a ser utilizado (esquema de templates): priority_queue<int> fila; 6-mai-09 Leandro Tonieto 8
Filas com prioridade com STL, métodos: Inserir um elemento na posição adequada da fila push() Remover elemento de maior prioridade da fila pop() Não retorna o elemento removido Obter elemento de maior prioridade na fila top() Retorna o elemento sem removê-lo Verifica se a fila está vazia empty() Tamanho atual da fila size() :: exemplo :: 6-mai-09 Leandro Tonieto 9
Filas com prioridade com STL, métodos: Inserir um elemento na posição adequada da fila push() Remover elemento de maior prioridade da fila pop() Não retorna o elemento removido Obter elemento de maior prioridade na fila top() Retorna o elemento sem removê-lo Verifica se a fila está vazia empty() Tamanho atual da fila size() :: exemplo :: 6-mai-09 Leandro Tonieto 10
Exercício com prority_queue: Criar classe Mensagem com atributos texto e prioridade e com sobrecarga do operador <, onde uma mensagem é < que outra a prioridade dela é menor que da outra: friend bool operator<(const Mensagem &uma, const Mensagem &outra){... } No main, criar uma fila com prioridades de mensagens, ler diversas mensagens e prioridades e adicionar na fila. Imprimir todos os elementos da fila. 6-mai-09 Leandro Tonieto 11
Iteradores: Recurso poderoso da STL Criar uma interdependência da estrutura de dados e a forma de percorrê-la. Pilhas (stack) e filas (queue) não oferecem iteradores. Se oferecessem iriam corromper o conceito dessas estruturas. Conceitos fundamentais da STL Containers Iterators 6-mai-09 Leandro Tonieto 12
Tipos de Iteradores Entrada ler um elemento do container. Do início para o fim, um elemento de cada vez. Saida - escrever um elemento no container. Do início para o fim, um elemento de cada vez. Para frente combina os iteradores de entrada e saída. Mantém o estado atual. Bidirecional igual o para frente também podendo percorrer o container para trás. Aleatório o mesmo que o bidirecional podendo avançar ou recuar mais de uma posição 6-mai-09 Leandro Tonieto 13
Operações com Iteradores (acumulativos) Todos ++p (pré-incrementa,avança) p++ (pós-incrementa,avança) Entrada *p (pegar o valor apontado por p) p = p1 p == p1 p!= p1 6-mai-09 Leandro Tonieto 14
Operações com Iteradores (acumulativos) Saída *p p = p1 Para frente Todas as operações de entrada e saída Bidirecional --p (pré-decrementa,recua) p-- (pós-decrementa,recua) 6-mai-09 Leandro Tonieto 15
Operações com Iteradores (acumulativos) Aleatório p+=i incrementa p em i posições p-=i decrementa p em i posições p[i] o elemento que está na posição i p<p1 se p está antes de p1 no container p<=p1 se p está antes ou no mesmo lugar que p1 no container p>p1 se p está depois de p1 no container p>=p1 se p está depois ou no mesmo lugar que p1 no container 6-mai-09 Leandro Tonieto 16
Como obter um iterador? list<tipo>::iterator i; i = lista.begin(); Pode ser usado: begin() - primeiro elemento end() - um ponteiro sujo que indica o próximo elemento (depois do fim) Exemplo: for(list<tipo>::iterator it=lista.begin(); it!=lista.end(); it++){ // faz alguma coisa } 6-mai-09 Leandro Tonieto 17
Listas com STL: Incluir biblioteca list: #include <list> Usar classe list com tipo de lista a ser utilizado (esquema de templates): list<int> lista; list<mensagem> listamensagens; 6-mai-09 Leandro Tonieto 18
Listas com STL, métodos: Inserir um elemento na lista push_front() - insere no início push_back() - insere no fim Remover elemento da lista pop_front() pop_back() Obter um elemento da lista :: exemplo :: front() ou back() Verifica se a lista está vazia empty() Tamanho atual da lista -size() 6-mai-09 Leandro Tonieto 19
Listas com STL, métodos: splice(posicao,outralista) Remove os elementos da outralista e coloca-os antes da posicao remove (valor) Remove todos os elementos=valor da lista unique Remove elementos duplicados merge (outralista) Fusão entre duas listas sem repetição 6-mai-09 Leandro Tonieto 20
Listas com STL, métodos: reverse() Inverte a lista sort() Ordena a lista em ordem ascendente clear() Remove todos os elementos da lista insert(iterador, valor) Inclui um valor na posição de um iterador. Retorna um novo iterador erase(iterador) Apaga o valor apontado pelo iterador 6-mai-09 Leandro Tonieto 21
Exercício com list: Criar classe Animal com atributos tipo e nome e com sobrecarga do operador <, onde um animal é < que outro quando o tipo de um é menor que outro e o nome de um é menor que outro. No main, criar duas listas (uma de cachorros e outra de gatos) e preencher com objetos do tipo animal. Fazer o merge das duas listas e imprimir. Fazer o sort das duas listas e imprimir. Inverter a lista e imprimir. 6-mai-09 Leandro Tonieto 22