Your SlideShare is downloading. ×
0
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
C++ Standard Template Library
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

C++ Standard Template Library

1,009

Published on

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,009
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
18
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  1. Introdução à STL (Standard Template Library) Felipe Sampaio, Robson Dornelles, Gerson Geraldo H. Cavalheiro
  2. Templates <ul><li>É uma ferramenta da linguagem C++ para a geração de código genérico </li></ul><ul><li>template<class tipo> </li></ul><ul><li>tipo soma(tipo a, tipo b) { </li></ul><ul><li>return a + b; </li></ul><ul><li>} </li></ul><ul><li>printf(“%d”, soma<int> (1,2)); </li></ul><ul><li>printf(“%f”, soma<float> (1.4,2.6)); </li></ul><ul><li>O código acima funciona para qualquer tipo que tenha o operador “+” sobrecarregado </li></ul>
  3. Templates <ul><li>typedef struct minha_string { </li></ul><ul><li>char *str; </li></ul><ul><li>minha_string(char* s) { </li></ul><ul><li>str = (char*) malloc(sizeof(strlen(s))); </li></ul><ul><li>strcpy(str,s); </li></ul><ul><li>} </li></ul><ul><li>minha_string operator+(minha_string b) { </li></ul><ul><li>minha_string n(strcat(str,b.str)); </li></ul><ul><li>return n; </li></ul><ul><li>} </li></ul><ul><li>}MINHA_STR; </li></ul><ul><li>int main() { </li></ul><ul><li>MINHA_STR a(&quot;abc&quot;); </li></ul><ul><li>MINHA_STR b(&quot;def&quot;); </li></ul><ul><li>printf(&quot;%s &quot;, soma<MINHA_STR> (a,b).str); </li></ul><ul><li>return 0; </li></ul><ul><li>} </li></ul>
  4. Afinal, o que é? <ul><li>Parte do ISO Standard C++ Library </li></ul><ul><li>STL = Standard Template Library </li></ul><ul><li>A STL implementa várias estruturas de dados, no formato de classes, utilizando templates </li></ul><ul><li>Assim, é possível guardar qualquer tipo nessas estruturas </li></ul><ul><li>Documentação oficial: </li></ul><ul><li>www.sgi.com/tech/stl </li></ul>
  5. Por que usar? <ul><li>Redução do tempo de desenvolvimento. </li></ul><ul><ul><li>Código pronto e depurado. </li></ul></ul><ul><li>Legibilidade de código </li></ul><ul><ul><li>Além de utilizar código padrão, o programa desenvolvido fica mais enxuto. </li></ul></ul><ul><li>Robustez </li></ul><ul><ul><li>As estruturas de dados de STL crescem automaticamente. </li></ul></ul><ul><li>Código portável </li></ul><ul><ul><li>Usa um padrão. </li></ul></ul><ul><li>Facilita a manutenção </li></ul><ul><ul><li>As estruturas de dados são, até certo ponto, intercambiáveis </li></ul></ul><ul><li>É fácil! </li></ul>
  6. Componentes básicos <ul><li>Trata-se de uma biblioteca que define: </li></ul><ul><li>Containers </li></ul><ul><ul><li>Estruturas de dados </li></ul></ul><ul><li>Iterators </li></ul><ul><ul><li>Iteradores para percorrer as estruturas de dados </li></ul></ul><ul><li>Algoritmos </li></ul><ul><ul><li>Oferecem serviços (funcões) para as estruturas de dados (busca, ordenação...) </li></ul></ul>
  7. Containers “top of mind” <ul><li>map </li></ul><ul><ul><li>Possui dois campos, uma chave e um valor, ambos campos podem ser de qualquer tipo e de qualquer valor </li></ul></ul><ul><ul><li>O conteúdo é mantido ordenado </li></ul></ul><ul><li>vector </li></ul><ul><ul><li>Semelhante a um vetor em C/C++, mas cresce automáticamente. </li></ul></ul><ul><li>list </li></ul><ul><ul><li>Semelhante ao vetor, mas implementada como uma lista encadeada </li></ul></ul>
  8. Uso do vector <ul><li>Métodos </li></ul><ul><ul><li>unsigned int size(); </li></ul></ul><ul><ul><ul><li>Retorna o número de elementos de um vetor </li></ul></ul></ul><ul><ul><li>push_back(type element); </li></ul></ul><ul><ul><ul><li>Insere, no fim, um novo elemento </li></ul></ul></ul><ul><ul><li>bool empty(); </li></ul></ul><ul><ul><ul><li>Retorna true se o vetor esta vazio </li></ul></ul></ul><ul><ul><li>void clear(); </li></ul></ul><ul><ul><ul><li>Remove todos os elementos do vetor </li></ul></ul></ul><ul><ul><li>type at(int n); </li></ul></ul><ul><ul><ul><li>Retorna o elemento que está na posição indicada, fazendo o teste de limites </li></ul></ul></ul>
  9. Uso do vector <ul><li>Operadores </li></ul><ul><ul><li>= </li></ul></ul><ul><ul><ul><li>Substitui o conteúdo do vetor destino com o conteúdo do vetor informado </li></ul></ul></ul><ul><ul><li>== </li></ul></ul><ul><ul><ul><li>Compara o conteúdo (elemento a elemento) do vetor </li></ul></ul></ul><ul><ul><li>[] </li></ul></ul><ul><ul><ul><li>Acesso à uma posição do vetor – sem teste de limites! </li></ul></ul></ul>
  10. Uso do vector <ul><li>Alocação prévia da área de dados </li></ul><ul><li>vector<int> v(100); </li></ul><ul><li>v[80] = 1; // Funciona! </li></ul><ul><li>v[200]= 1; // Ups... </li></ul><ul><li>Crescimento automático </li></ul><ul><li>vector<int> v2; </li></ul><ul><li>int i; </li></ul><ul><li>while( std::cin >> I ) </li></ul><ul><li>v.push_back(i); </li></ul>
  11. Uso do vector <ul><li>#include <iostream> </li></ul><ul><li>#include <vector> </li></ul><ul><li>using namespace std; </li></ul><ul><li>int main() { </li></ul><ul><li>int i; </li></ul><ul><li>vector <int> example; </li></ul><ul><li>example.push_back(3); </li></ul><ul><li>example.push_back(10); </li></ul><ul><li>example.push_back(33); </li></ul><ul><li>for( i = 0 ; i < example.size() ; i++) </li></ul><ul><li>cout << example[i] << &quot; &quot;; </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>
  12. Uso do vector <ul><li>#include <iostream> </li></ul><ul><li>#include <vector> </li></ul><ul><li>using namespace std; </li></ul><ul><li>int main() { </li></ul><ul><li>vector <int> example; </li></ul><ul><li>vector <int> another_vector; </li></ul><ul><li>another_vector.push_back(10); </li></ul><ul><li>example.push_back(10); </li></ul><ul><li>if( example == another_vector ) </li></ul><ul><li>example.push_back(20); </li></ul><ul><li>for( i = 0 ; i < example.size() ; i++) </li></ul><ul><li>cout << example[i] << &quot; &quot;; </li></ul><ul><li>return 0; </li></ul><ul><li>} </li></ul>
  13. Uso de list <ul><li>Métodos </li></ul><ul><ul><li>unsigned int size(); </li></ul></ul><ul><ul><ul><li>Retorna o número de elementos de um vetor </li></ul></ul></ul><ul><ul><li>push_back/front(type element); </li></ul></ul><ul><ul><ul><li>Insere, no fim/início, um novo elemento </li></ul></ul></ul><ul><ul><li>pop_back/front(); </li></ul></ul><ul><ul><ul><li>Retira o último/primeiro elemento </li></ul></ul></ul><ul><ul><li>back/front(); </li></ul></ul><ul><ul><ul><li>Retorna o último/primeiro elemento </li></ul></ul></ul><ul><ul><li>iterator insert(iterator pos, const T& x); </li></ul></ul><ul><ul><ul><li>Insere um elemento após a posição indicada </li></ul></ul></ul><ul><ul><li>empty, clear, swap, resize, split, merge, ... </li></ul></ul>
  14. Uso de list <ul><li>Operadores </li></ul><ul><ul><li>= </li></ul></ul><ul><ul><ul><li>Substitui o conteúdo do vetor destino com o conteúdo do vetor informado </li></ul></ul></ul><ul><ul><li>== </li></ul></ul><ul><ul><ul><li>Compara o conteúdo (elemento a elemento) do vetor </li></ul></ul></ul><ul><ul><li>< </li></ul></ul><ul><ul><ul><li>Comparação lexicográfica </li></ul></ul></ul>
  15. Uso de list <ul><li>int i; </li></ul><ul><li>list<int> lst; </li></ul><ul><li>for( i = 1 ; i <= 5 ; ++i ) </li></ul><ul><li>lst.push_back(i); </li></ul><ul><li>for( i = 10 ; i > 5 ; ++i ) </li></ul><ul><li>lst.push_front(i); </li></ul><ul><li>... </li></ul>
  16. Uso de map <ul><li>Estrutura de dados que faz uma associação entre valores de dois tipos de dados distintos </li></ul><ul><ul><li>Chave </li></ul></ul><ul><ul><li>Dado </li></ul></ul><ul><li>Não pode haver dois dados com a mesma chave! </li></ul>
  17. Uso de map <ul><li>Métodos </li></ul><ul><ul><li>size, empty, clear, swap, ... </li></ul></ul><ul><ul><li>iterator find(const key_type& k) </li></ul></ul><ul><ul><ul><li>Retorna a posição onde o elemento identificado pela chave se encontra </li></ul></ul></ul><ul><ul><li>size_type count(const key_type& k) </li></ul></ul><ul><ul><ul><li>Retorna o número de elementos que possui a chave indicada (que deve ser, no map, 1 ou 0) </li></ul></ul></ul>
  18. Uso de map <ul><li>Operadores </li></ul><ul><ul><li>[] </li></ul></ul><ul><ul><ul><li>Onde é informada a chave </li></ul></ul></ul><ul><ul><li>= </li></ul></ul><ul><ul><ul><li>Operação de atribuição </li></ul></ul></ul><ul><ul><li>== </li></ul></ul><ul><ul><ul><li>Compara dois maps </li></ul></ul></ul><ul><ul><li>< </li></ul></ul><ul><ul><ul><li>Teste lexicográfico </li></ul></ul></ul>
  19. Uso de map <ul><li>long aux; </li></ul><ul><li>map<long,int> raiz; </li></ul><ul><li>raiz[4] = 2; </li></ul><ul><li>raiz[1000000] = 1000; </li></ul><ul><li>std::cin >> aux; </li></ul><ul><li>if( root.count(aux) != 0 ) </li></ul><ul><li>std::cout << root[l] </li></ul><ul><li>else </li></ul><ul><li>std::cout << &quot;Nao tem raiz perfeita!&quot;; </li></ul>
  20. Uso de map #include <map> double bancaSaoJoao( const caipira& caipa ) { map<char*,float,ltstr> preco; char item[20]; double conta = 0.0; price[&quot;carapinha&quot;] = 0.75; preco[&quot;quentao&quot;] = 1.5; preco[&quot;pinhao&quot;] = 1.25; preco[&quot;pipoca&quot;] = 0.75; while( std::cin >> item ) { item = caipa.whatYouWantBaby(); conta += price[item]; } return conta; }
  21. Uso de map #include <map> struct ltstr { bool operator()(const char* s1, const char* s2) const { return strcmp(s1, s2) < 0; } }; double bancaSaoJoao( const caipira& caipa ) { map<char*,float,ltstr> preco; char item[20]; double conta = 0.0; preco[&quot;carapinha&quot;] = 0.75; ...
  22. Uso de map int main() { map<const char*, int, ltstr> months; months[&quot;january&quot;] = 31; months[&quot;february&quot;] = 28; months[&quot;march&quot;] = 31; months[&quot;april&quot;] = 30; months[&quot;may&quot;] = 31; months[&quot;june&quot;] = 30; months[&quot;july&quot;] = 31; months[&quot;august&quot;] = 31; months[&quot;september&quot;] = 30; months[&quot;october&quot;] = 31; months[&quot;november&quot;] = 30; months[&quot;december&quot;] = 31; cout << &quot;june -> &quot; << months[&quot;june&quot;] << endl; map<const char*, int, ltstr>::iterator cur = months.find(&quot;june&quot;); map<const char*, int, ltstr>::iterator prev = cur; map<const char*, int, ltstr>::iterator next = cur; ++next; --prev; cout << &quot;Previous (in alphabetical order) is &quot; << (*prev).first << endl; cout << &quot;Next (in alphabetical order) is &quot; << (*next).first << endl; }
  23. Iterators <ul><li>Declaração </li></ul><ul><ul><li>Identificação do container. </li></ul></ul><ul><li>list<int> lst; </li></ul><ul><li>list<int>::iterator li; </li></ul><ul><li>Acesso ao início da lista: </li></ul><ul><li>li = lst.begin(); </li></ul><ul><li>Acesso ao fim da lista: </li></ul><ul><li>li = lst.end(); </li></ul><ul><li>Acesso ao elemento </li></ul><ul><li>int aux; </li></ul><ul><li>aux = *li; </li></ul>
  24. Iterators <ul><li>Permite “passear” nos containers </li></ul><ul><li>list<int> lst; </li></ul><ul><li>list<int>::iterator li; </li></ul><ul><li>for( li = lst.begin() ; </li></ul><ul><li>lst != lst.end() ; </li></ul><ul><li>lst++ ) </li></ul><ul><li>std::cout << *it << std::endl; </li></ul><ul><li>// também pode: </li></ul><ul><li>li = lst.begin(); </li></ul><ul><li>*li = 313; </li></ul>
  25. Algoritmos <ul><li>Permitem percorrer containters executando operações pré-definidas </li></ul><ul><li>Existem vários, diversos e variados. </li></ul><ul><ul><li>Exemplo </li></ul></ul><ul><li>list<int> lst; </li></ul><ul><li>vector<int> vet; </li></ul><ul><li>copy(lst.begin(), lst.end(), vet.begin()); </li></ul><ul><li>copy(lst.begin(), lst.end(), </li></ul><ul><li>ostream_iterator<int>(cout, &quot;,&quot;)); </li></ul><ul><li>sort(lst.begin(), lst.last() ); </li></ul>
  26. Criando classes para serem incluidas em containers <ul><li>Obrigatório: </li></ul><ul><ul><li>Definir o operador de cópia: </li></ul></ul><ul><li>operator=(const T&) </li></ul><ul><ul><li>Implementar o construtor default: </li></ul></ul><ul><li>T() </li></ul><ul><ul><li>Implementar o construtor de cópia: </li></ul></ul><ul><li>T(const T&) </li></ul><ul><li>Caso o container desejado seja ordenado, ex: map<> </li></ul><ul><ul><li>Deve ser definido o operador “menor-que”: </li></ul></ul><ul><li>operator<() </li></ul><ul><ul><li>Alguns tipos primitivos possuem: </li></ul></ul><ul><ul><ul><li>int, char, string </li></ul></ul></ul><ul><ul><li>Outros não: </li></ul></ul><ul><ul><ul><li>char * </li></ul></ul></ul>
  27. Exemplo de tipo definido pelo usuário <ul><li>Agenda de nomes </li></ul><ul><li>struct Nome { </li></ul><ul><li>char* prenome; </li></ul><ul><li>char* sobrenome; </li></ul><ul><li>bool operator<(const Nome& n) { </li></ul><ul><li>return strcmp(prenome, n.prenome) < 0; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>map<Nome,int> agenda; </li></ul>
  28. Cuidados <ul><li>Acesso à posição inválida de vector<> . </li></ul><ul><li>vector<int> v; </li></ul><ul><li>v[100] = 1; // Ups! </li></ul><ul><li>Solução: </li></ul><ul><ul><li>Utilizar a interface prevista: </li></ul></ul><ul><ul><ul><li>push_back() </li></ul></ul></ul><ul><ul><ul><li>reserve() </li></ul></ul></ul><ul><ul><ul><li>capacity() </li></ul></ul></ul><ul><ul><li>Pré-alocar no construtor. </li></ul></ul>
  29. Cuidados <ul><li>Cuidar para não criar elementos no map<> de forma inadvertida </li></ul><ul><li>if( toto[&quot;bob&quot;] == 1 ) ... </li></ul><ul><ul><li>Se bob não existia em toto , agora existe! </li></ul></ul><ul><li>Evite utilizando count() para verificar se a entrada existe. </li></ul><ul><li>if( toto.count(&quot;bob&quot;) ) ... </li></ul>
  30. Cuidados <ul><li>Utilizar a interface de serviços observando o desempenho: </li></ul><ul><ul><li>Exemplo: </li></ul></ul><ul><ul><ul><li>empty() em list<> . </li></ul></ul></ul><ul><ul><li>Muito lento </li></ul></ul><ul><li>if( lst.count() == 0 ) { ... } </li></ul><ul><ul><li>Bem mais rápido </li></ul></ul><ul><li>if( lst.empty() ) {...} </li></ul><ul><li>Como saber? </li></ul><ul><ul><li>Estudando a STL... </li></ul></ul>
  31. Cuidados <ul><li>Utilizar um iterador invalidado </li></ul><ul><li>list<int> lst; </li></ul><ul><li>list<int>::iterator li; </li></ul><ul><li>li = lst.begin(); </li></ul><ul><li>lst.erase(li); </li></ul><ul><li>++li; // Ups! </li></ul><ul><li>Utilizar o retorno do erase para avançar </li></ul><ul><li>li = lst.erase(li); // Ok! </li></ul>
  32. Erro de compilação comum! <ul><li>Erro de compilação comum! </li></ul><ul><li>vector<vector<int>> vet; </li></ul><ul><li>Falta de espaço! </li></ul><ul><li>O analisador léxico entende como right-shift. </li></ul>
  33. Muitos outros containers <ul><li>set , multiset , multimap </li></ul><ul><li>queue , priority_queue </li></ul><ul><li>stack , deque </li></ul><ul><li>slist , bitset , valarray </li></ul>

×