Programação genérica e�STL (Standard Template Library)
1
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Desorientação a objeto
"I find OOP technically unsound... It attempts to decompose the world in terms of interfaces that vary on a single type. To deal with the real problems you need multisorted algebras... I find OOP philosophically unsound. It claims that everything is an object - saying that everything is an object is saying nothing at all."
2
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Desorientação a objeto
"I find OOP technically unsound... It attempts to decompose the world in terms of interfaces that vary on a single type. To deal with the real problems you need multisorted algebras... I find OOP philosophically unsound. It claims that everything is an object - saying that everything is an object is saying nothing at all."
3
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Desorientação a objeto
"I find OOP technically unsound... It attempts to decompose the world in terms of interfaces that vary on a single type. To deal with the real problems you need multisorted algebras... I find OOP philosophically unsound. It claims that everything is an object - saying that everything is an object is saying nothing at all."
4
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Desorientação a objeto
"I find OOP technically unsound... It attempts to decompose the world in terms of interfaces that vary on a single type. To deal with the real problems you need multisorted algebras... I find OOP philosophically unsound. It claims that everything is an object - saying that everything is an object is saying nothing at all."
5
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Desorientação a objeto
"I find OOP technically unsound... It attempts to decompose the world in terms of interfaces that vary on a single type. To deal with the real problems you need multisorted algebras... I find OOP philosophically unsound. It claims that everything is an object - saying that everything is an object is saying nothing at all."
6
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Desorientação a objeto
"I find OOP technically unsound... It attempts to decompose the world in terms of interfaces that vary on a single type. To deal with the real problems you need multisorted algebras... I find OOP philosophically unsound. It claims that everything is an object - saying that everything is an object is saying nothing at all."
7
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Programação genérica
O foco da programação genérica é projetar algoritmos eficientes que operam sobre representações abstratas. A essência desse processo, chamado de lifting, é encontrar os requisitos mínimos que tipos concretos devem satisfazer para permitir a álgebra necessária sobre as estruturas de dados.
8
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Lifting
9
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Lifting
10
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Lifting
11
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Lifting
12
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Lifting
13
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Lifting
14
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Lifting
15
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Lifting
16
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Lifting
17
Nossa abstração não está completa!
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Lifting
18
Válido apenas para numéricos.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Lifting
19
Genérico!
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Lifting
O processo de lifting continua, iterativamente, até que atinjamos a genericidade desejada.
20
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Concepts
Ao longo do processo de lifting de uma implementação, os requisitos impostos a tipos aumentam. Eventualmente, podemos agrupá-los em uma entidade própria chamada de concept (conceito).
21
Concept | Requirement |
DefaultConstructible<T> | T must have a default constructor. |
CopyConstructible<T> | T must have a copy constructor. |
CopyAssignable<T> | T must have a copy assignment operator. |
Addable<T> | T must support operator+ among two T values returning T. |
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Concepts
Ao longo do processo de lifting de uma implementação, os requisitos impostos a tipos aumentam. Eventualmente, podemos agrupá-los em uma entidade própria chamada de concept (conceito).
A quantidade de requisitos que um conceito deve "empacotar" varia. Assim como em classes, é possível compor ou refinar conceitos através de outros já existentes.
22
Concept | Requirement |
DefaultConstructible<T> | T must have a default constructor. |
CopyConstructible<T> | T must have a copy constructor. |
CopyAssignable<T> | T must have a copy assignment operator. |
Addable<T> | T must support operator+ among two T values returning T. |
Concept | Requirement |
Summable<T> | DefaultConstructible<T>, CopyConstructible<T>, CopyAssignable<T>, Addable<T> |
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Concepts
Conceitos são o coração da STL…
23
| Concept | Requirement |
| Container<T> | Um armazém (com posse) de elementos; sem ordem definida; etc. |
Sequence<T> | Refina container; impõe ordem linear de elementos; permite inserção/ remoção; etc. | |
AssociativeContainer<T> | Também refina container; baseado em operações de chave/valor; etc. | |
… | … | |
| TrivialIterator<T> | Um iterador básico para atravessar contêineres; etc. |
InputIterator<T> | Refina iterator; permite dereferenciação para ler do contêiner; etc. | |
OutputIterator<T> | Também refina iterator; permite dereferenciação para escrever no contêiner; etc. | |
… | … | |
| Generator<T> | Um objeto que pode ser invocado como função, sem parâmetros. |
UnaryFunction<T> | Um objeto que pode ser invocado como função, recebendo um parâmetro. | |
Predicate<T> | Um objeto que pode ser invocado, recebendo um parâmetro, retornando bool1. | |
… | |
Containers
Iterators
Functors
1) Estritamente dizendo, o tipo de retorno deve ser conversível para bool.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Tipos associados a concepts
É comum que abstrações necessitem de informações adicionais a respeito de um conceito para implementar determinada operação. Exemplo: Qual o tipo do elemento de um contêiner?
24
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Tipos associados a concepts
É comum que abstrações necessitem de informações adicionais a respeito de um conceito para implementar determinada operação. Exemplo: Qual o tipo do elemento de um contêiner?
Por isso, conceitos frequentemente exigem, além de interfaces, que tipos sejam associados a suas definições. Por exemplo, Container<T> exporta, entre outros, os seguintes tipos associados.
25
Tipo Associado | Significado |
ContainerT::value_type | Tipo do elemento armazenado. |
ContainerT::iterator | Tipo do iterator usado nesse contêiner. |
ContainerT::reference_type | Tipo que se comporta como referência - normalmente &T, mas pode variar com endereçamentos "especiais" de memória. |
ContainerT::pointer_type | Tipo que se comporta como ponteiro - normalmente T*, mas pode ser usado para proxies. |
ContainerT::size_type | Tipo que representa o número de elementos no contêiner. |
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Tipos associados a concepts
É comum que abstrações necessitem de informações adicionais a respeito de um conceito para implementar determinada operação. Exemplo: Qual o tipo do elemento de um contêiner?
Por isso, conceitos frequentemente exigem, além de interfaces, que tipos sejam associados a suas definições. Por exemplo, Container<T> exporta, entre outros, os seguintes tipos associados.
26
Tipo Associado | Significado |
ContainerT::value_type | Tipo do elemento armazenado. |
ContainerT::iterator | Tipo do iterator usado nesse contêiner. |
ContainerT::reference_type | Tipo que se comporta como referência - normalmente &T, mas pode variar com endereçamentos "especiais" de memória. |
ContainerT::pointer_type | Tipo que se comporta como ponteiro - normalmente T*, mas pode ser usado para proxies. |
ContainerT::size_type | Tipo que representa o número de elementos no contêiner. |
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Modelando um conceito
É claro… Uma implementação genérica não depende apenas de um "conceito". No fim das contas, precisamos de tipos concretos como argumentos. Tais tipos devem modelar determinado conceito.
27
Container
RandomAccessContainer
Sorted�AssociativeContainer
Associative�Container
Reversible�Container
Forward�Container
Sequence
BackInsertion�Sequence
UniqueSorted�AssociativeContainer
PairAssociative�Container
Unique�AssociativeContainer
std::vector
std::map
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Conceitos (ainda) não existem na linguagem
Conceitos não são cidadãos de primeira-classe em C++, atualmente são apenas "documentação". Houve algumas tentativas de incorporá-los nativamente. Porém... foram todas frustradas.
28
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Conceitos (ainda) não existem na linguagem
Conceitos não são cidadãos de primeira-classe em C++, atualmente são apenas "documentação". Houve algumas tentativas de incorporá-los nativamente. Porém... foram todas frustradas.
Eventualmente, com a introdução de conceitos (algum dia), escreveremos código assim:
Versão curta
Versão com requires
29
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Conceitos (ainda) não existem na linguagem
Mas qual é exatamente a diferença entre as versões de sort com e sem conceito?
Versão curta
Versão com requires
Versão template pura
30
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
O por quê de concepts
31
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
O por quê de concepts
32
Qual o erro desse programa?
Continua...
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
O por quê de concepts
O motivo dessas "monstruosidades" no diagnóstico é o seguinte:
33
O que é um dependent name?
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
O por quê de concepts
O motivo dessas "monstruosidades" no diagnóstico é o seguinte:
Apenas nesse momento certos erros são encontrados!
34
O que é um dependent name?
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
O por quê de concepts
O motivo dessas "monstruosidades" no diagnóstico é o seguinte:
Apenas nesse momento certos erros são encontrados!
35
O que é um dependent name?
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
O por quê de concepts
36
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: especialização
37
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: especialização
38
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: especialização
39
O que é um parâmetro não-tipo de template?
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: especialização
40
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: traits
41
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: traits
42
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: traits
43
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: traits
44
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: traits
45
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: traits
46
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: tag dispatching
47
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: tag dispatching
48
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: tag dispatching
49
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: tag dispatching
50
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: tag dispatching
51
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: tag dispatching
52
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: tag dispatching
53
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: policy classes
1) Similar ao design pattern Template Method do GoF.
54
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: policy classes
55
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: policy classes
56
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: policy classes
57
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: policy classes
58
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: policy classes
59
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: policy classes
60
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: policy classes
61
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: policy classes
62
Note a semelhança com os operadores new e delete.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: template de template
63
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: template de template
64
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: template de template
65
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: SFINAE
66
Definição de A
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: SFINAE
67
Definição de A
1) A instanciação é apenas ilustrativa, realizada internamente pelo compilador.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: SFINAE
68
1) A instanciação é apenas ilustrativa, realizada internamente pelo compilador.
Instanciação1
Definição de A
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: SFINAE
69
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: SFINAE
70
Instanciação1
O tipo do parâmetro "produzido" não existe (sequer faz sentido). Mas isso não implica em erro de compilação:�o efeito é apenas a eliminação dessa sobrecarga para fins de resolução.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: SFINAE
71
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: SFINAE
72
Se T é classe, então ponteiro para membro existe.
Senão, ocorre falha de substituição: versão … é escolhida.
Tamanho de char é 1.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: SFINAE
73
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: SFINAE
74
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: templates variádicas
75
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: templates variádicas
76
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: templates variádicas
77
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Técnicas de templates: templates variádicas
78
Qual a generalização de std::pair que utiliza templates variádicas?
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
STL (Standard Template Library)
A STL é uma coleção de algoritmos, implementados genericamente, que interage com estruturas de dados através de abstrações independentes.
79
Qual foi a primeira implementação da STL?
std::vector
std::list
std::set
std::multiset
std::map
std::multimap
std::unordered_map
...
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
STL (Standard Template Library)
A STL é uma coleção de algoritmos, implementados genericamente, que interage com estruturas de dados através de abstrações independentes.
80
Qual foi a primeira implementação da STL?
std::find
std::copy
std::sort
std::transform
std::lower_bound
...
std::vector
std::list
std::set
std::multiset
std::map
std::multimap
std::unordered_map
...
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
STL (Standard Template Library)
A STL é uma coleção de algoritmos, implementados genericamente, que interage com estruturas de dados através de abstrações independentes.
81
Qual foi a primeira implementação da STL?
std::find
std::copy
std::sort
std::transform
std::lower_bound
...
std::vector
std::list
std::set
std::multiset
std::map
std::multimap
std::unordered_map
...
Iteradores
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
STL (Standard Template Library)
A STL é uma coleção de algoritmos, implementados genericamente, que interage com estruturas de dados através de abstrações independentes.
82
Qual foi a primeira implementação da STL?
std::find
std::copy
std::sort
std::transform
std::lower_bound
...
std::vector
std::list
std::set
std::multiset
std::map
std::multimap
std::unordered_map
...
Iteradores
Functors
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
STL (Standard Template Library)
A STL é uma coleção de algoritmos, implementados genericamente, que interage com estruturas de dados através de abstrações independentes.
83
Qual foi a primeira implementação da STL?
std::find
std::copy
std::sort
std::transform
std::lower_bound
...
std::vector
std::list
std::set
std::multiset
std::map
std::multimap
std::unordered_map
...
Iteradores
Functors
std::stack
std::queue
std::priority_queue
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
STL (Standard Template Library)
A STL é uma coleção de algoritmos, implementados genericamente, que interage com estruturas de dados através de abstrações independentes.
84
Qual foi a primeira implementação da STL?
std::find
std::copy
std::sort
std::transform
std::lower_bound
...
std::vector
std::list
std::set
std::multiset
std::map
std::multimap
std::unordered_map
...
Iteradores
Functors
std::stack
std::queue
std::priority_queue
std::pair�std::tuple
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
STL (Standard Template Library)
A STL é uma coleção de algoritmos, implementados genericamente, que interage com estruturas de dados através de abstrações independentes.
85
Qual foi a primeira implementação da STL?
std::find
std::copy
std::sort
std::transform
std::lower_bound
...
std::vector
std::list
std::set
std::multiset
std::map
std::multimap
std::unordered_map
...
Iteradores
Functors
std::stack
std::queue
std::priority_queue
std::pair�std::tuple
Concepts
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::array
É importante escolher o contêiner apropriado para uma tarefa, pois cada contêiner tem suas vantagens, mas também restrições. Inclusive com relação ao tipo armazenado. Por exemplo, pode ser exigido que T suporte cópia, construção padrão, entre outras.
86
Qual a semântica dos contêineres: valor ou referência?
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::array
É importante escolher o contêiner apropriado para uma tarefa, pois cada contêiner tem suas vantagens, mas também restrições. Inclusive com relação ao tipo armazenado. Por exemplo, pode ser exigido que T suporte cópia, construção padrão, entre outras.
87
Qual a semântica dos contêineres: valor ou referência?
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::vector
88
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::vector
89
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::vector
90
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::vector
91
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::deque
92
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::deque
93
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::deque
94
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::list
95
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::list
96
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::list
97
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::forward_list
98
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::forward_list
99
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::forward_list
100
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::set e std::map
101
1) O padrão não exige que a implementação seja com árvores, mas, pelos requisitos de complexidade, são a melhor opção: red-black trees.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::set e std::map
102
1) O padrão não exige que a implementação seja com árvores, mas, pelos requisitos de complexidade, são a melhor opção: red-black trees.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::set e std::map
103
1) O padrão não exige que a implementação seja com árvores, mas, pelos requisitos de complexidade, são a melhor opção: red-black trees.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::set e std::map
104
1) O padrão não exige que a implementação seja com árvores, mas, pelos requisitos de complexidade, são a melhor opção: red-black trees.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::set e std::map
105
1) O padrão não exige que a implementação seja com árvores, mas, pelos requisitos de complexidade, são a melhor opção: red-black trees.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::set e std::map
106
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::set e std::map
107
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::unordered_map/set.
108
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::unordered_map/set.
109
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::unordered_map/set.
110
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::unordered_map/set.
111
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::unordered_map/set.
112
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::unordered_map/set.
113
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::unordered_map/set.
https://www.codeproject.com/articles/23085/a-generic-open-address-hash-table-implementation-w
114
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::stack.
115
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::stack.
116
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Alguns contêineres: std::stack.
117
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Algoritmos
118
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Algoritmos
119
Essa abordagem requer que contêineres já possuam espaço suficiente para a operação em questão, pois iteradores não são capazes de alterar a estrutura dos contêineres em si, apenas seus elementos.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Algoritmos
120
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Algoritmos
Quando o algoritmo opera em mais de um intervalo, tal como um de entrada e um de saída, apenas o iterador para o início do segundo é necessário (tipicamente, ambos deve ser ter o mesmo tamanho).
121
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Algoritmos
122
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Algoritmos
123
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Algoritmos
As versões que realizam cópia tem o sufixo _copy em seus nomes.
124
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Algoritmos
125
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Algoritmos
Tais algoritmos têm o sufixo _if.
126
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Algoritmos
127
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Algoritmos
Porém, a remoção é apenas lógica. O elemento continua no contêiner e um novo iterador após-fim é retornado.
128
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Algoritmos
Porém, a remoção é apenas lógica. O elemento continua no contêiner e um novo iterador após-fim é retornado.
Para realmente removermos o elemento utilizamos o erase-remove idiom.
129
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Biblioteca padrão
Originalmente, a STL era uma implementação independente. Em C++98/03, seus componentes foram incorporados à biblioteca padrão. Esta última contém ainda outras "sub-bibliotecas" tais como de IOStreams e de strings. Em C++11, as seguintes novidades foram introduzidas:
130
Exemplo: Matching de telefone e nome.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Biblioteca padrão
Originalmente, a STL era uma implementação independente. Em C++98/03, seus componentes foram incorporados à biblioteca padrão. Esta última contém ainda outras "sub-bibliotecas" tais como de IOStreams e de strings. Em C++11, as seguintes novidades foram introduzidas:
131
Exemplo: Matching de telefone e nome.
Exemplo: Tags HTML.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Biblioteca padrão: expressões regulares
132
Exemplo: Matching de telefone e nome.
Exemplo: Tags HTML.
Exemplo: Tags HTML com captura, (), certificando que as tags se correspondem.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Biblioteca padrão: expressões regulares
133
Exemplo: Matching de telefone e nome.
Exemplo: Tags HTML.
Exemplo: Tags HTML com captura, (), certificando que as tags se correspondem.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Biblioteca padrão: expressões regulares
134
Exemplo: Matching de telefone e nome.
Exemplo: Tags HTML.
Exemplo: Tags HTML com captura, (), certificando que as tags se correspondem.
Exemplo: O mesmo que o anterior, só que com a gramática do grep ao invés de ECMAScript.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Biblioteca padrão: expressões regulares
Precisamos escapar os parêntesis do agrupamento.
135
Exemplo: Matching de telefone e nome.
Exemplo: Tags HTML.
Exemplo: Tags HTML com captura, (), certificando que as tags se correspondem.
Exemplo: O mesmo que o anterior, só que com a gramática do grep ao invés de ECMAScript.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Biblioteca padrão: expressões regulares
136
Exemplo: Matching de telefone e nome.
Exemplo: Tags HTML.
Exemplo: Tags HTML com captura, (), certificando que as tags se correspondem.
Exemplo: O mesmo que o anterior, só que com a gramática do grep ao invés de ECMAScript.
Exemplo: std::regex_search realiza um std::regex_match em qualquer parte da string.
false
true
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Biblioteca padrão: clocks e temporizadores
137
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Biblioteca padrão: clocks e temporizadores
138
Duration: std::chrono::duration, representa o número de ticks por uma fração, em segundos.
Tipo utilizado para a duração.
Fração em segundos: default de 1 segundo.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Biblioteca padrão: clocks e temporizadores
Para as principais unidades, já existem typedefs pré-definidos.
139
Duration: std::chrono::duration, representa o número de ticks por uma fração, em segundos.
Tipo utilizado para a duração.
Fração em segundos: default de 1 segundo.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Biblioteca padrão: clocks e temporizadores
Para as principais unidades, já existem typedefs pré-definidos.
140
Duration: std::chrono::duration, representa o número de ticks por uma fração, em segundos.
Tipo utilizado para a duração.
Fração em segundos: default de 1 segundo.
Em C++14 podemos usar os operadores literais de tempo.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Biblioteca padrão: clocks e temporizadores
141
Timepoint: std::time_point, representa a associação de um época com uma duration.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Biblioteca padrão: clocks e temporizadores
142
Timepoint: std::time_point, representa a associação de um época com uma duration.
Unidade de tempo
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Biblioteca padrão: clocks e temporizadores
143
Timepoint: std::time_point, representa a associação de um época com uma duration.
Unidade de tempo
std::system_clock
std::steady_clock
std::high_resolution_clock
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Biblioteca padrão: clocks e temporizadores
144
Exemplo: imprime a época do clock e o instante atual.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Biblioteca padrão: clocks e temporizadores
145
Exemplo: imprime a época do clock e o instante atual.
Exemplo: benchmark simples.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Biblioteca padrão: clocks e temporizadores
Para converter de unidades de tempo mais precisas para outras menos precisas: duration_cast.
146
Exemplo: imprime a época do clock e o instante atual.
Exemplo: benchmark simples.
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Biblioteca padrão: concorrência
147
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Exercícios
148
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
Algumas referências
149
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com
150
Curso de C++ moderno
Perguntas?
© Leandro T. C. Melo - www.ltcmelo.com
© Leandro T. C. Melo - www.ltcmelo.com