2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é?...

28
2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos Functores

Transcript of 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é?...

Page 1: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos1

Aula 12

Biblioteca padrão do C++ O que é? Composição Alguns componentes:

Contentores Iteradores Algoritmos Functores

Page 2: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos2

C++ Padrão

Normalização de 1989 a 1997 Publicação em 1998 Nova versão em 2004? Norma de 750 páginas, publicada pelo ISO

(Organização Internacional de Normalização) “Information Technology – Programming Languages – C+

+” (ISO/IEC 14882-1998)

Page 3: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos3

Biblioteca padrão do C++

Parte da norma é uma biblioteca: E/S Cadeias de caracteres Contentores Algoritmos Cálculo numérico Internacionalização

Page 4: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos4

STL (Standard Template Library)

Cerne da biblioteca padrão Fornece ferramentas para manipular

colecções de dados Separação clara entre dados e operações Componentes genéricos

Novo nível de abstracção

Page 5: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos5

Componentes da STL

Contentores (dados) Gestão de colecções de itens de um dado tipo

Iteradores (“cola” entre contentores e algoritmos) Percorrem contentores Contentores vistos como sequências Interface comum, independente do tipo de contentor

Algoritmos (operações comuns sobre sequências) Usados para processar os itens dos contentores

Functores Necessidades especiais Suplementos, restrições ou configurações para algoritmos e

operações

Page 6: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos6

Contentores

Sequenciais Posição de itens não depende do seu valor! (ordem

extrínseca) Exemplos: std::vector, std::deque e std::list

Associativos Posição de itens depende do seu valor e ordem exacta

depende de relação de ordem (ordem intrínseca) Relação de ordem por omissão: operador < Exemplos: std::set, std::multiset, std::map e std::multimap

Page 7: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos7

vector

Implementação típica: matrizes dinâmicas Acesso aleatório (directo e eficiente usando indexação) Adição e remoção eficientes de itens na traseira #include <vector> Operações comuns

Construir: vector<int>() Indexar: operator[]() Saber se está vazio: empty() Saber dimensão: size() Acrescentar atrás: push_back() Remover último item: pop_back()

Page 8: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos8

deque (Double-Ended QUEue)

Implementação típica: matrizes dinâmicas Acesso aleatório Adição e remoção eficientes de itens na traseira e na frente #include <deque> Operações comuns:

Construir: deque<double>() Indexar: operator[]() Saber se está vazia: empty() Saber comprimento: size() Acrescentar à frente/atrás: push_front() e push_back() Remover primeiro/último item: pop_front() e pop_back()

Page 9: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos9

list (lista)

Implementação típica: cadeias duplamente ligadas Acesso sequencial Inserção e remoção eficiente de itens em qualquer posição #include <list> Algumas operações:

Construir: list<float>() Saber se está vazia: empty() Saber comprimento: size() Saber primeiro item: front() Saber último item: back() …

Page 10: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos10

set (conjunto) e multiset (colecção)

Ordem intrínseca (posição dos itens depende do seu valor) Implementação típica: árvores binárias Conjuntos: sem repetições de itens Colecções: com repetições Não se podem modificar os itens #include <set> ou #include <multiset> Operações comuns:

Contruir: set<int>() ou multiset<int>() Saber se está vazio: empty() Saber cardinalidade: size() Inserir item: insert() Remover item: erase() Saber número de itens com valor: count()

Page 11: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos11

map (mapa) e multimap (multimapa)

Itens são pares (chave, valor) – e.g., pair<int, string> Ordem intrínseca (posição dos pares depende da sua chave) Mapas: sem repetição de chaves Multimapas: com repetição #include <map> ou #include <multimap> Operações comuns:

Construir: map<int, string>() ou multimap<int, string>() Saber se está vazio: empty() Saber número de pares: size() Indexar usando chave: operator[]() Inserir par: insert() Remover pares: erase() Saber número de pares com chave: count()

Page 12: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos12

Contentores especiais

Implementação típica: contentores anteriores Sem iteradores

stack (pilhas) Contentor que gere os seus elementos de acordo com a política LIFO

queue (filas) Contentor que gere os seus elementos de acordo com a política FIFO

priority_queue (filas prioritárias) Frente da fila é item mais prioritário Por omissão, prioridade comparada usando operador <

Page 13: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos13

Que contentor usar?

Use vector (contentor mais simples) Insere ou remove itens à frente e atrás? Use deque Insere ou remove itens a meio? Use list Procura com frequência itens pelo seu valor? Use set ou multiset

Deseja separar itens em chave e valor? Use map ou multimap

Page 14: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos14

Iteradores

Permitem definir sequências Permitem percorrer contentores Referenciam itens Operadores fundamentais:

Saber conteúdo ou item referenciado: * Avançar: ++ Comparar: == e != Atribuir: =

Page 15: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos15

Iteradores

Operações de obtenção de iteradores (apenas contentores não-especiais): begin() end() …

Há sempre dois tipos de iteradores: contentor::iterator contentor::const_iterator

begin() end()

Page 16: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos16

Tipos de iteradores

Bidireccionais Avançam e recuam (++ e --) Contentores: list, set, multiset, map e multimap

De acesso aleatório São também bidireccionais Permitem acesso aleatório aos itens da sequência Permitem aritmética mais completa de iteradores: saltos, distâncias, ... Contentores: vector e deque

vector<int>::const_iterator i = v.begin();i += 2;cout << i[3] << endl;cout << *i << endl;

Page 17: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos17

Iteradores especiais

De inserção Na traseira de um contentor Na frente de um contentor Em local dado

Iteradores associados a um canal Inserem ou extraem itens de canais automaticamente

Iteradores reversos Avançar recua, recuar avança

Page 18: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos18

Iteradores especiais (exemplo)

list<int> l;for(int i = 0; i != 10; ++I) l.push_back(i);

vector<int> v;copy(l.begin(), l.end(), back_inserter(v));

set<int> c;copy(l.begin(), l.end(), inserter(c, c.begin()));

copy(l.begin(), l.end(), ostream_iterator<int>(cout, “ “));cout << endl;

copy(l.rbegin(), l.rend(), ostream_iterator<int>(cout, “\n“));

Page 19: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos19

Algoritmos

#include <algorithm> #include <numeric> Rotinas genéricas sobre sequências Sequências definidas por iteradores Relação com contentores através de iteradores: não são

operações membro! Sufixos dos nomes dos algoritmos:

_if – têm predicado como argumento, usando-o para identificar itens _copy – copiam para um destino ao actuar, não alterando o original

Page 20: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos20

Tipos de algoritmos

Não modificadores Modificadores De remoção De mutação De ordenação Para sequências de itens intrinsecamente

ordenadas Numéricos

Page 21: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos21

sort() e reverse()

int main(){ vector<int> v;

v.push_back(13); v.push_back(7); v.push_back(10);

sort(v.begin(), v.end()); copy(v.begin(), v.end(), ostream_iterator<int>(cout, “\n“));

reverse(v.begin(), v.end()); copy(v.begin(), v.end(), ostream_iterator<int>(cout, “\n“));}

Page 22: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos22

replace() e unique_copy()

int main(){ list<int> l;

l.push_back(7); l.push_back(7); l.push_back(9); l.push_back(10);

replace(l.begin(), l.end(), 7, 44); copy(l.begin(), l.end(), ostream_iterator<int>(cout, “\n“));

unique_copy(l.begin(), l.end(), ostream_iterator<int>(cout, “\n“));}

Page 23: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos23

Classes functoras

Classes cujas instâncias se comportam como rotinas Instâncias (functores) podem ser usadas como rotinas Têm de ter como operação membro operator() Definição:

class X { public: tipo_de_devolução operator() (parâmetros) const; …};…X fo;…fo(argumentos); // ou fo.operator()(argumentos);// outipo_de_devolução resultado = fo(argumentos);

Page 24: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos24

Functores

Tipos Predicados Aritméticos

Vantagens face a ponteiros para rotinas Podem ter atributos: “rotinas” com estado! Maior possibilidade de utilizar código em-linha

Page 25: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos25

Functores pré-definidos

negate<T>() plus<T>() minus<T>() multiplies<T>() divides<T>() modulus<T>() equal_to<T>() not_equal_to<T>()

less<T>() greater<T>() less_equal<T>() greater_equal<T>() logical_not<T>() logical_and<T>() logical_or<T>()

Page 26: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos26

Adaptadores de functores

Combinam functores com functores, functores com valores e functores com rotinas

Adaptadores de functores pré-definidos: bind1st() bind2nd() not1() not2()

Page 27: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos27

Functores: Aumentando a STL

template <typename T>class Mostra : public unary_function<T, void> { public: Mostra(ostream& out); void operator()(T const& t) const;

private: ostream& out;};

template <typename T>Mostra<T>::Mostra(ostream& out) : out(out) {}

template <typename T>void Mostra<T>::operator()(T const& t) const { out << t << endl;}

Page 28: 2002/2003 Programação Orientada para Objectos 1 Aula 12 Biblioteca padrão do C++ O que é? Composição Alguns componentes: Contentores Iteradores Algoritmos.

2002/2003 Programação Orientada para

Objectos28

Como usar o novo functor

int main(){ vector<int> v;

v.push_back(2); v.push_back(5); v.push_back(9);

// Algoritmo for_each for_each(v.begin(), v.end(), Mostra<int>(cout));}