Aula 12
Biblioteca padrão do C++
O que é?
Composição
Alguns componentes:
Contentores
Iteradores
Algoritmos
Functores
1
2002/2003
Programação Orientada para
Objectos
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)
2
“Information Technology – Programming Languages –
C++” (ISO/IEC 14882-1998)
2002/2003
Programação Orientada para
Objectos
Biblioteca padrão do C++
Parte da norma é uma biblioteca:
3
E/S
Cadeias de caracteres
Contentores
Algoritmos
Cálculo numérico
Internacionalização
2002/2003
Programação Orientada para
Objectos
STL (Standard Template Library)
Cerne da biblioteca padrão
Fornece ferramentas para manipular
colecções de dados
4
Separação clara entre dados e operações
Componentes genéricos
Novo nível de abstracção
2002/2003
Programação Orientada para
Objectos
Componentes da STL
Contentores (dados)
Iteradores (“cola” entre contentores e algoritmos)
Usados para processar os itens dos contentores
Functores
5
Percorrem contentores
Contentores vistos como sequências
Interface comum, independente do tipo de contentor
Algoritmos (operações comuns sobre sequências)
Gestão de colecções de itens de um dado tipo
Necessidades especiais
Suplementos, restrições ou configurações para algoritmos e
operações
2002/2003
Programação Orientada para
Objectos
Contentores
Sequenciais
Associativos
6
Posição de itens não depende do seu valor! (ordem
extrínseca)
Exemplos: std::vector, std::deque e std::list
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
2002/2003
Programação Orientada para
Objectos
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
7
Construir: vector<int>()
Indexar: operator[]()
Saber se está vazio: empty()
Saber dimensão: size()
Acrescentar atrás: push_back()
Remover último item: pop_back()
2002/2003
Programação Orientada para
Objectos
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:
8
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()
2002/2003
Programação Orientada para
Objectos
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:
9
Construir: list<float>()
Saber se está vazia: empty()
Saber comprimento: size()
Saber primeiro item: front()
Saber último item: back()
…
2002/2003
Programação Orientada para
Objectos
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:
10
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()
2002/2003
Programação Orientada para
Objectos
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:
11
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()
2002/2003
Programação Orientada para
Objectos
Contentores especiais
Implementação típica: contentores anteriores
Sem iteradores
stack (pilhas)
queue (filas)
Contentor que gere os seus elementos de acordo com a política FIFO
priority_queue (filas prioritárias)
12
Contentor que gere os seus elementos de acordo com a política LIFO
Frente da fila é item mais prioritário
Por omissão, prioridade comparada usando operador <
2002/2003
Programação Orientada para
Objectos
Que contentor usar?
13
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
2002/2003
Programação Orientada para
Objectos
Iteradores
Permitem definir sequências
Permitem percorrer contentores
Referenciam itens
Operadores fundamentais:
14
Saber conteúdo ou item referenciado: *
Avançar: ++
Comparar: == e !=
Atribuir: =
2002/2003
Programação Orientada para
Objectos
Iteradores
Operações de obtenção de iteradores (apenas contentores
não-especiais):
begin()
end()
Há sempre dois tipos de iteradores:
15
begin()
end()
…
contentor::iterator
contentor::const_iterator
2002/2003
Programação Orientada para
Objectos
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;
16
2002/2003
Programação Orientada para
Objectos
Iteradores especiais
De inserção
Iteradores associados a um canal
Inserem ou extraem itens de canais automaticamente
Iteradores reversos
17
Na traseira de um contentor
Na frente de um contentor
Em local dado
Avançar recua, recuar avança
2002/2003
Programação Orientada para
Objectos
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“));
18
2002/2003
Programação Orientada para
Objectos
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:
19
_if – têm predicado como argumento, usando-o para identificar itens
_copy – copiam para um destino ao actuar, não alterando o original
2002/2003
Programação Orientada para
Objectos
Tipos de algoritmos
20
Não modificadores
Modificadores
De remoção
De mutação
De ordenação
Para sequências de itens intrinsecamente
ordenadas
Numéricos
2002/2003
Programação Orientada para
Objectos
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“));
}
21
2002/2003
Programação Orientada para
Objectos
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“));
}
22
2002/2003
Programação Orientada para
Objectos
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);
// ou
tipo_de_devolução resultado = fo(argumentos);
23
2002/2003
Programação Orientada para
Objectos
Functores
Tipos
Vantagens face a ponteiros para rotinas
24
Predicados
Aritméticos
Podem ter atributos: “rotinas” com estado!
Maior possibilidade de utilizar código em-linha
2002/2003
Programação Orientada para
Objectos
Functores pré-definidos
25
negate<T>()
plus<T>()
minus<T>()
multiplies<T>()
divides<T>()
modulus<T>()
equal_to<T>()
not_equal_to<T>()
2002/2003
less<T>()
greater<T>()
less_equal<T>()
greater_equal<T>()
logical_not<T>()
logical_and<T>()
logical_or<T>()
Programação Orientada para
Objectos
Adaptadores de functores
Combinam functores com functores, functores
com valores e functores com rotinas
Adaptadores de functores pré-definidos:
26
bind1st()
bind2nd()
not1()
not2()
2002/2003
Programação Orientada para
Objectos
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;
}
27
2002/2003
Programação Orientada para
Objectos
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));
}
28
2002/2003
Programação Orientada para
Objectos