61
PCC104 - Projeto e Análise de Algoritmos Marco Antonio M. Carvalho Departamento de Computação Instituto de Ciências Exatas e Biológicas Universidade Federal de Ouro Preto 19 de outubro de 2017 Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 1 / 61

Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

PCC104 - Projeto e Análise de Algoritmos

Marco Antonio M. Carvalho

Departamento de ComputaçãoInstituto de Ciências Exatas e Biológicas

Universidade Federal de Ouro Preto

19 de outubro de 2017

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 1 / 61

Page 2: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Avisos

Site da disciplina:I http://www.decom.ufop.br/marco/

Lista de e-mails:I [email protected]

Para solicitar acesso:I http://groups.google.com/group/pcc104

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 2 / 61

Page 3: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Na aula de hoje

1 Genéricos

2 Standard Template LibraryContêineresIteradores

3 Algoritmos

4 Contêineresvectorlistdequeset e multisetmap e multimapstackqueuepriority_queue

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 3 / 61

Page 4: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Avisos

Atenção!Este material cobre apenas a parte da STL referente à ementa da disciplinaPCC104.

Não há a intenção de ser completo ou profundo.

A STL é mais profundamente descrita no material da disciplina BCC221 -Programação Orientada a Objetos (graduação).

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 4 / 61

Page 5: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Genéricos

IntroduçãoOs genéricos (ou templates) são uma das mais poderosas maneiras dereuso de software.

Funções genéricas e classes genéricas permitem que o programadorespecifique com apenas um segmento de código uma família de funções ouclasses relacionadas (sobrecarregadas).

Esta técnica é chamada programação genérica.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 5 / 61

Page 6: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Genéricos

IntroduçãoPor exemplo, podemos criar uma função genérica que ordene um vetor e alinguagem se encarrega de criar especializações que tratarão vetores do tipoint, float, string e etc.

Podemos também criar uma classe genérica para a estrutura de dadosPilha, e a linguagem se encarrega de criar as especializações pilha de int,float, string, etc..

O genérico é um estêncil (define o formato), a especialização é conteúdo.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 6 / 61

Page 7: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Genéricos

Funções GenéricasFunções sobrecarregadas normalmente realizam operações similares ouidênticas em diferentes tipos de dados: soma de int, float, e frações.

Se as operações são idênticas para diferentes tipos, elas podem serexpressas mais compacta e convenientemente através de funçõesgenéricas.

O programador escreve a definição da função genérica e, baseado nosparâmetros explicitamente enviados ou inferidos a partir da chamada dafunção, o compilador gera as especializações para cada tipo de chamada.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 7 / 61

Page 8: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Genéricos

Classes GenéricasPara compreendermos o funcionamento da estrutura de dados Pilha, nãoimporta o tipo dos dados empilhados/desempilhados.

No entanto, para implementarmos uma pilha, é necessário associá-la a umtipo.

O ideal é descrever uma pilha genericamente, assim como a entendemos einstanciar versões específicas desta classe genérica fica por conta docompilador.

Desta forma, uma classe genérica Pilha vira uma coleção de classesespecializadas: pilha de int, float, string, frações, restaurantes, etc.

Para instanciarmos um objeto de uma classe genérica, precisamos informarqual tipo deve ser associado à classe.

No exemplo a seguir, declaramos dois objetos, associando os tipos double eint.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 8 / 61

Page 9: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Exemplo

#include <iostream >using namespace std;#include "Stack.h"int main (){

Stack < double > doubleStack( 5 );double doubleValue = 1.1;while ( doubleStack.push( doubleValue ) ) {

cout << doubleValue << ’␣’;doubleValue += 1.1;

}Stack < int > intStack;int intValue = 1;while ( intStack.push( intValue ) ) {

cout << intValue << ’␣’;intValue ++;

}while ( intStack.pop( intValue ) )

cout << intValue << ’␣’;return 0;

}

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 9 / 61

Page 10: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

IntroduçãoConsiderando a utilidade do reuso de software e também a utilidade dasestruturas de dados e algoritmos utilizados por programadores a StandardTemplate Library (STL) foi adicionada à biblioteca padrão C++.

A STL define componentes genéricos reutilizáveis poderosos queimplementam várias estruturas de dados e algoritmos que processam estasestruturas.

Basicamente, a STL é composta por contêineres, iteradores e algoritmos.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 10 / 61

Page 11: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

IntroduçãoContêineres são genéricos de estruturas de dados e possuem métodosassociados a eles. Tornam as estruturas independentes das estruturas dedados.

Iteradores são semelhantes a ponteiros, utilizados para percorrer emanipular os elementos de um contêiner. Tornam os algoritmosindependentes dos contêineres.

Algoritmos são os métodos que realizam operações tais como buscar,ordenar e comparar elementos ou contêineres inteiros, utilizando iteradores.

Existem aproximadamente 85 algoritmos padrão implementados na STL,mais operadores e operações de contextos específicos.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 11 / 61

Page 12: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

ContêineresOs contêineres são divididos em três categorias principais:

Contêineres Sequenciais: Estruturas de dados lineares;Contêineres Associativos: Estruturas de dados não lineares, pares

chave/valor.Adaptadores de Contêineres: São contêineres sequenciais, porém, em

versões restringidas.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 12 / 61

Page 13: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

Contêineres Sequenciaisvector Inserções e remoções no final, acesso direto a qualquer

elemento;deque Fila duplamente ligada, inserções e remoções no início ou no

final, acesso direto a qualquer elemento;list Lista duplamente ligada, inserção e remoção em qualquer

ponto.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 13 / 61

Page 14: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

Contêineres Associativosset Busca rápida, não permite elementos duplicados;

multiset Busca rápida, permite elementos duplicados;map Mapeamento um-para-um, não permite elementos duplicados,

busca rápida;multimap Mapeamento um-para-um, permite elementos duplicados,

busca rápida.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 14 / 61

Page 15: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

Adaptadores de Contêineresstack Last-in, first out (LIFO);queue First –in, first out (FIFO);

priority_queue O elemento de maior prioridade é sempre o primeiroelemento a sair.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 15 / 61

Page 16: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

ContêineresTodos os contêineres da STL fornecem funcionalidades similares, e muitasoperações genéricas se aplicam a todos os contêineres.

Outras operações se aplicam somente a subconjuntos de contêineressimilares.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 16 / 61

Page 17: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

Funções Comuns a Todos ContêineresConstrutor default Fornece a inicialização padrão do contêiner.Construtor Cópia Construtor que inicializa um contêiner para ser a cópia

de outro do mesmo tipo;Destrutor Simplesmente destrói o contêiner quando não for mais

necessário.empty Retorna true se não houver elementos no contêiner e false

caso contrário.size Retorna o número de elementos no contêiner.

operator= Atribui um contêiner a outro.operator< Retorna true se o primeiro contêiner for menor que o segundo

e false caso contrário.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 17 / 61

Page 18: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

Operadoresoperator<= Retorna true se o primeiro contêiner for menor ou igual ao

segundo e false caso contrário;operator> Retorna true se o primeiro contêiner for maior que o segundo

e false caso contrário;operator>= Retorna true se o primeiro contêiner for maior ou igual ao

segundo e false caso contrário;operator== Retorna true se o primeiro contêiner for igual ao segundo e

false caso contrário;operator!= Retorna true se o primeiro contêiner for diferente do segundo

e false caso contrário;swap Troca os elementos de dois contêineres

Atenção! Os operadores <, <=, >, >=, == e != não são fornecidos parao contêiner priority_queue.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 18 / 61

Page 19: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

Funções Comuns a Contêineres Sequenciais e Associativosmax_size Retorna o número máximo de elementos de um contêiner;

begin Retorna um iterator para o primeiro elemento do contêiner;end Retorna um iterator para a posição após o final do contêiner;

rbegin Retorna um reverse_iterator para o primeiro elemento docontêiner invertido;

rend Retorna um reverse_iterator para a posição após o final docontêiner invertido;

erase Apaga um ou mais elementos do contêiner;clear Apaga todos os elementos do contêiner.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 19 / 61

Page 20: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

Bibliotecas de Contêineres<vector> Vetor;

<list> Lista;<deque> Fila duplamente ligada;<queue> Contém queue e priority_queue;<stack> Pilha;<map> Contém map e multimap;<set> Contém set e multiset;

<bitset> Conjunto de bits (vetor em que cada elemento é um bit – 0ou 1).

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 20 / 61

Page 21: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

IteradoresIteradores são utilizados para apontar elementos de contêineressequenciais e associativos.

São objetos declarados na biblioteca <iterator>.

Algumas operações e algoritmos retornam iteradores como resultado.

Se um iterador i aponta para um elemento:I ++i aponta para o próximo elemento (há diferença para o

reverse_iterator);I *i se refere ao conteúdo do elemento apontado por i.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 21 / 61

Page 22: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Iteradores

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 22 / 61

Page 23: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Iteradores

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 23 / 61

Page 24: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

Operações em IteradoresAtenção! As operações variam de acordo com o tipo de iterador declarado.

++p Incremento prefixado;p++ Incremento pós-fixado;

*p Referencia o conteúdo apontado;p = p1 Atribui um iterador a outro;

p == p1 Compara dois iteradores quanto a igualdade;p != p1 Compara dois iteradores quanto a desigualdade;

--p Decremento prefixado;p-- Decremento pós-fixado;

p+= i Incrementa o iterador em i posições;p-= i Decrementa o iterador em i posições;p + i Resulta em um iterador posicionado em p+i elementos;

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 24 / 61

Page 25: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

Operações em IteradoresAtenção! As operações variam de acordo com o tipo de iterador declarado.

p – i Resulta em um iterador posicionado em p-i elementos;p[ i ] Retorna uma referência para o elemento a i posições a partir

de p;p < p1 Retorna true se o primeiro iterador estiver antes do segundo

no contêiner;p < =p1 Retorna true se o primeiro iterador estiver antes ou na

mesma posição do segundo no contêiner;p > p1 Retorna true se o primeiro iterador estiver após o segundo no

contêiner;p >= p1 Retorna true se o primeiro iterador estiver após ou na mesma

posição do segundo no contêiner.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 25 / 61

Page 26: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

AlgoritmosA STL inclui aproximadamente 85 algoritmos padrão:

I Podem ser utilizados genericamente, em vários tipos de contêineres;I Operam indiretamente sobre os elementos de um contêiner usando

iteradores;I Frequentemente, também retornam iteradores como resultado.

Este desacoplamento dos contêineres permite que os algoritmos sejamgenéricos, assim como as estruturas de dados.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 26 / 61

Page 27: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

vectorA classe vector implementa a estrutura de dados sequencial e contíguaarranjo, possuindo acesso indexado aos elementos.

Este contêiner é dinâmico, ou seja, a cada inserção o contêiner seredimensiona automaticamente.

Adicionalmente, arranjos estáticos podem ser encontrados na classe array.

As classes que implementam contêineres são genéricas, logo, deve serdefinido o tipo na declaração de um objeto.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 27 / 61

Page 28: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

vectorAlguns métodos do contêiner vector incluem:push_back: : adiciona um elemento ao final do vector.

front: determina o primeiro elemento;back: determina o último elemento;

at: determina o elemento em uma determinada posição, masantes verifica se é uma posição válida;

insert: insere um elemento em uma posição especificada por umiterador.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 28 / 61

Page 29: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Exemplo

#include <iostream >#include <vector >using namespace std;int main (){

int i;

vector <int > first;vector <int > second (4 ,100);vector <int > third (second.begin(), second.end ());vector <int > fourth (third );

second.push_back (1);vector <int >:: iterator it = second.begin ();second.insert(it , 200);

cout << "Primeiro␣elemento:" <<second.front()<<endl;cout << "Ultimo␣elemento:" <<second.back()<<endl;cout << "Elemento␣3:" <<second.at(2)<<endl;

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 29 / 61

Page 30: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Exemplo

cout << "O␣tamanho:" <<second.size()<<endl;

first.push_back (3);first.pop_back ();

for (it = first.begin (); it != first.end(); ++it)cout << *it << ’␣’;

first.clear ();it = first.begin ();first.erase(it);

return 0;}

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 30 / 61

Page 31: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

listA classe list implementa a estrutura de dados sequencial lista duplamenteencadeada, que pode ser percorrida em ambas as direções.

Adicionalmente, listas simplesmente encadeadas podem ser encontradas naclasse forward_list.

Quando comparados a arrays, vectors e deques, lists possuem melhorperformance em operações de inserção, remoção e movimentação deelementos.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 31 / 61

Page 32: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

listNo exemplo a seguir, temos os seguintes métodos da classe list:

sort: ordena a lista em ordem crescente;unique: remove elementos duplicados;remove: apaga todas as ocorrências de um determinado valor da lista.

push_front: insere um elemento no início da lista.push_back: insere um elemento no final da lista.pop_front: remove o elemento no início da lista.pop_back: remove elemento no final da lista.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 32 / 61

Page 33: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Exemplo

#include <iostream >#include <list >using namespace std;

int main (){list <int > first;list <int > second (4 ,100);list <int > third (second.begin(),second.end ());list <int > fourth (third );

first.push_front (1);first.push_front (2);

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 33 / 61

Page 34: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Exemplo

first.push_back (4);first.push_back (1);

first.remove (4);

first.unique ();

first.pop_front ();first.pop_back ();

first.sort ();

for (list <int >:: iterator it = first.begin (); it != first.end(); it++)cout << *it << "␣";

return 0;}

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 34 / 61

Page 35: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

dequeUm deque (double-ended queue) é um contêiner dinâmico a partir do qualpodem ser eliminados e inseridos itens em ambas as extremidades.

Para inserção no início, o deque (além do list) possui o método push_front.

Na STL, deques são implementados como arranjos dinâmicos. Logo, ooperador [] permite acesso direto aos elementos do deque, como emvectors.

Em geral, um deque possui um desempenho levemente inferior em relaçãoa um vector, porém, é mais eficiente para fazer inserções e remoções noinício.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 35 / 61

Page 36: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Exemplo

#include <iostream >#include <deque >using namespace std;

int main (){int i;

deque <int > first;deque <int > second (4 ,100);deque <int > third (second.begin(), second.end ());deque <int > fourth (third );

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 36 / 61

Page 37: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Exemplo

first.push_front (2);first.push_front (3);

first.push_back (1);

first [1] = 5;

first.pop_front ();first.pop_back ();

for (i=0; i < first.size (); i++)cout << "␣" << first[i];

return 0;}

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 37 / 61

Page 38: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

set e multisetEstruturas de conjuntos e multiconjuntos são implementadas nas classesset e multiset, respectivamente.

Ambos são implementados como árvores binárias de busca ou árvoresvermelho-e-preto.

Internamente, os elementos estão sempre ordenados de acordo com ocomparador fornecido.

Sets e multisets não possuem acesso direto aos elementos, e estes nãopodem ter seus valores alterados.

Um multiset possui todas as características de um set, porém, permiteelementos repetidos.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 38 / 61

Page 39: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

set e multisetAdicionalmente, conjuntos e multiconjuntos desordenados (implementadospor tabelas hash com encadeamento) podem ser encontradosrespectivamente nas classes unordered_set e unordered_multiset.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 39 / 61

Page 40: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Exemplo

#include <iostream >#include <set >using namespace std;

int main (){

set <int > first (10);set <int > second;set <int > third (first );set <int > fourth (first.begin(), first.end ());

for (int i = 0; i < 15; ++i)second.insert(i);

first.insert (10);

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 40 / 61

Page 41: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Exemplo

first.erase (40);

set <int >:: iterator it = first.find (40);

first.swap(second );

for (it=first.begin (); it!=first.end(); it++)cout << "␣" << *it;

cout << endl;

return 0;}

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 41 / 61

Page 42: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Exemplo

#include <iostream >#include <set >using namespace std;

int main (){multiset <int > first;multiset <int > second;multiset <int > third (first );multiset <int > fourth (first.begin(), first.end ());

for (int i = 0; i < 15; ++i)second.insert (15);

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 42 / 61

Page 43: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Exemplo

second.insert (10);

cout <<second.count(15)<<endl;

multiset <int >:: iterator result = first.find (15);

if(result == first.end())cout <<"nao␣encontrou";

pair <multiset <int >:: iterator , multiset <int >:: iterator > ret;ret = second.equal_range (15);

second.erase(ret.first ,ret.second );

return 0;}

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 43 / 61

Page 44: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

map e multimapNa STL, mapas e multimapas são implementados como árvores binárias debusca, portanto, ordenados.

Adicionalmente, mapas e multimapas desordenados (implementados portabelas hash com encadeamento) podem ser encontrados respectivamentenas classes unordered_map e unordered_multimap.

As chaves são únicas no map e podem se repetir no multimap.

Chaves e valores podem possuir tipos diferentes.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 44 / 61

Page 45: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

map e multimapComo os mapas armazenam pares de elementos, os iteradores possuemuma característica extra:

I it->first ou (*it).first acessa a chave do elemento referenciado peloiterador it;

I it->second ou (*it).second acessa o valor do elemento referenciadopelo iterador it.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 45 / 61

Page 46: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

map e multimapAs classes implementam o operador [], entretanto, não permitem acessodireto aos elementos.

Acessar uma chave através deste operador insere esta chave no mapa, casoela não esteja presente.

Assim, o operador não é adequado para verificar se uma chave estápresente no mapa, é preciso utilizar o método find.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 46 / 61

Page 47: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Exemplo

#include <iostream >#include <map >using namespace std;

int main (){map <char ,int > first;

first[’a’]=10;first[’b’]=30;first[’c’]=50;first[’d’]=70;

first.insert(’e’, 80);

map <char ,int > second (first.begin(), first.end ());map <char ,int > third (second );

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 47 / 61

Page 48: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Exemplo

map <char ,int >:: iterator it = first.find(’a’);

cout << it ->first << ’\t’ << it->second << ’\n’;

map <char , int >:: iterator it;for (it = first.begin (); it != first.end(); ++it)

cout << it ->first << ’\t’ << it->second << ’\n’;

return 0;}

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 48 / 61

Page 49: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Exemplo

#include <iostream >#include <map >using namespace std;

int main (){multimap <char ,int > first;

first.insert(pair <char ,int >(’a’ ,10));first.insert(pair <char ,int >(’b’ ,15));first.insert(pair <char ,int >(’b’ ,20));first.insert(pair <char ,int >(’c’ ,25));

first[’c’]=26;

multimap <char ,int >:: iterator it = first.find(’a’);

first.erase(it);

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 49 / 61

Page 50: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Exemplo

multimap <char ,int > second (first.begin(), first.end ());multimap <char ,int > third (second );

multimap <char , int >:: iterator it;

for (it = first.begin (); it != first.end(); ++it)cout << it ->first << ’\t’ << it->second << ’\n’;

pair <multimap <char ,int >:: iterator ,multimap <char ,int >:: iterator > ret;

ret = first.equal_range(’b’);

for (it=ret.first; it!=ret.second; ++it)cout << ’␣’ << it->second;

cout << ’\n’;

return 0;}

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 50 / 61

Page 51: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

Adaptadores de ContêineresAdaptadores de contêineres são classes que usam um contêiner encapsuladocomo estrutura subjacente:

I Uma pilha pode ser implementada sobre um vector, deque ou list.I Uma fila pode ser implementada sobre um deque ou list.I Uma fila de prioridades pode ser implementada sobre um vector ou um

deque.Além de definir o tipo dos elementos de um adaptador de contêiner nadeclaração do objeto, também é possível definir a estrutura de dadossubjacente.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 51 / 61

Page 52: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

Adaptadores de ContêineresOs adaptadores de contêineres (pilha, fila e fila de prioridades) contémpraticamente os mesmos métodos:

empty: testa se o contêiner está vazio;size: retorna a quantidade de elementos do contêiner;

top (exceto fila): acessa o elemento do topo;push: insere um elemento;pop: remove um elemento;

front (somente fila): acessa o próximo elemento;back (somente fila): acessa o último elemento.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 52 / 61

Page 53: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

stackO adaptador de contêiner stack implementa a estrutura de dados pilha.

Por padrão, utiliza um deque como estrutura subjacente.

Os elementos são inseridos e removidos no final da estrutura.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 53 / 61

Page 54: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Exemplo

#include <iostream >#include <stack >#include <vector >#include <list >using namespace std;

int main (){stack < int > intDequeStack;stack < int , vector < int > > intVectorStack;stack < int , list < int > > intListStack;

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 54 / 61

Page 55: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Exemplo

intDequeStack.push (1);intVectorStack.push (1);intListStack.push (1);

cout << intDequeStack.size() << ’␣’<<intDequeStack.top ();

intDequeStack.pop();intVectorStack.pop ();intListStack.pop();

return 0;}

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 55 / 61

Page 56: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

queueO adaptador de contêiner queue implementa a estrutura de dados fila.

Por padrão, utiliza um deque como estrutura subjacente.

Os elementos são inseridos no final da estrutura e removidos no início.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 56 / 61

Page 57: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Exemplo

#include <iostream >#include <queue >namespace std;

int main (){queue < int , list <int > > intListQueue;queue < double > values;

values.push (3.2);values.push (9.8);values.push (5.4);

while (! values.empty ()){cout << values.front () << ’␣’;values.pop();

}cout << endl;

return 0;}

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 57 / 61

Page 58: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

priority_queueO adaptador de contêiner priority_queue implementa a estrutura de dadosfila de prioridades.

Por padrão, utiliza um vector como estrutura subjacente, utilizado paraorganizar um heap.

Os elementos são inseridos e removidos no final da estrutura.

Por padrão, tem-se um MaxHeap, ou seja, quanto maior o valor doelemento, maior sua prioridade.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 58 / 61

Page 59: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Exemplo

#include <iostream >#include <queue >using namespace std;

int main (){priority_queue < double > priorities;priority_queue < double , deque <double > > dequePriorityQueue;

priorities.push (3.2);priorities.push (9.8);priorities.push (5.4);

while (! priorities.empty ()) {cout << priorities.top() << ’␣’;priorities.pop ();

}cout << endl;

return 0;}

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 59 / 61

Page 60: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

STL

Muito além...Ainda há na STL:

I Classe bitset (manipulação de conjuntos de bits);I Pair;I Objetos Função;I Vários algoritmos.

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 60 / 61

Page 61: Departamento de Computação Instituto de Ciências Exatas e ...€¦ · Na aula de hoje 1 Genéricos 2 StandardTemplateLibrary Contêineres Iteradores 3 Algoritmos 4 Contêineres

Dúvidas?

Marco Antonio M. Carvalho (UFOP) PCC104 19 de outubro de 2017 61 / 61