Você está na página 1de 10

STL em C++ 1.

Introduo
STL? Sigla para Standard Template Library. uma biblioteca disponibilizada pelos ambientes de desenvolvimento C++ contendo um conjunto de classes de colees (estruturas de dados) e de algoritmos de colees, organizados na forma de gabaritos (templates). O uso de STL pretende oferecer os seguintes benefcios: reutilizao de cdigo como baseado em gabaritos, as classes de STL podem ser adaptadas a tipos distintos sem mudana de funcionalidade (type safe collections). portabilidade e facilidade de uso

2. Categorias de classes na STL


As classes implementadas pela STL podem ser categorizadas em trs grandes grupos: Containers classes utilizadas para armazenamento de dados, implementando uma coleo Iteradores (iterators) classes que permitem a varredura pelos elemento de uma coleo seguindo uma determinada regra Algoritmos classes que implementam mtodos para realizao de algoritmos comuns de estruturas de dados sobre as colees.

Containers
Correspondem s colees de elementos de um determinado tipo, na forma de gabaritos de classe. Os conteiners definidos pela STL so: vector: elementos organizados na forma de um array que pode crescer dinamicamente. list: elementos organizados na forma de uma lista duplamente encadeada. deque: elementos organizados em sequncia, permitindo insero ou remoo no incio ou no fim sem necessidade de movimentao de outros elementos. map: cada elemento um par <chave, elemento> sendo que a chave usada para ordenao da coleo.

set: coleo ordenada na qual os prprios elementos so utilizados como chaves para ordenao da coleo. multimap multiset

Mtodos comuns aos gabaritos de container: empty: determina se a coleo est vazia size: determina o nmero de elementos na coleo begin: retorna um iterador para a frente, apontando para o incio da coleo end: retorna um iterador para a frente, apontando para o prximo elemento aps o fim da coleo rbegin: retorna um iterador para trs, apontando para o fim da coleo rend: retorna um iterador para trs, apontando para o elemento anterior ao incio da coleo. clear: apaga todos os elementos de uma coleo. erase: apaga um elemento da coleo.

Mtodos de adio e remoo em deque e vector push_back: adiciona elemento ao fim da coleo push_front: adiciona elemento ao incio da coleo back: obter uma referncia para elemento no fim da coleo front: obter uma referncia para elemento no incio da coleo pop_back: remove um elemento do fim da coleo push_back: remove um elemento do incio da coleo

Operaes de acesso a elementos em vector, map e deque: utiliza-se o operador [ ] como em um array comum.

Iteradores
Correspondem a objetos que podem ser utilizados para acessar os elementos de um container. Trs categorias de iteradores so suportadas: iterator: permite percurso dos elementos do incio para o fim da coleo reverse_iterator: permite percurso dos elementos na ordem inversa (do fim para o incio) da coleo. random_access: acesso aleatrio. Definido para os gabaritos vector.

Algoritmos
Correspondem a gabaritos de funes que implementam algoritmos de estruturas de dados (definidos na biblioteca algorithm). As funes so divididas em 3 categorias: sequncia: implementam operaes de busca e alterao da sequncia de elementos do container classificao: implementam classificao dos elementos do container numricos: implementam funes numricas comuns sobre os elementos do container.

2.3.1 Sequncia Alguns algoritmos de sequncia: copy(start, end, dest): copia os elementos entre os iteradores start e end para dest. fill(start, end, val): atribui val a todos os elementos entre os iteradores start e end remove(start, end, val): remove todos os elementos de valor val entre os iteradores start e end. replace(start, end, old_value, new_value): substitui os elementos iguais a old_value por new_value entre os iteradores start e end. reverse(start, end): inverte a ordem dos elementos entre os iteradores start e end rotate(start, middle, end): rotaciona os elementos entre os iteradores start e end de tal maneira que o iterador middle fique posicionado onde antes estava o iterador start. equal (start1, end1, start2): retorna true se os elementos entre os iteradores start1 e end1 so iguais aos da faixa de mesmo tamanho iniciado em start2. find(start, end, val): retorna um iterador para a primeira ocorrncia do elemento val entre os iteradores start e end. search(start1, end1, start2, end2): procura o subconjunto dos elementos entre os iteradores start2 e end2 dentro do conjunto dos elementos entre start1 e end1. Os algoritmos operam sobre os containers utilizando somente os iteradores dos containers. Exemplo:
using namespace std; #include <vector> #include <algorithm> #include <iostream> void rotate_reverse_replace_test(); int _main(int argc, char* argv[]) { rotate_reverse_replace_test(); return 0;

} void rotate_reverse_replace_test() { int elementos[] = {3, 8, 4, 7, 2, 1}; vector<int> teste; for (int i = 0; i < 6; i++) { teste.push_back(elementos[i]); } //rotation vector<int>::iterator inicio = teste.begin(); vector<int>::iterator fim = teste.end(); vector<int>::iterator meio = inicio + 3; rotate(inicio, meio, fim); cout << "Elementos rotacionados: " << endl; for (vector<int>::const_iterator fwd = teste.begin(); fwd < teste.end(); fwd++) { cout << *fwd << " "; } //reversing inicio = teste.begin(); fim = teste.end(); reverse(inicio, fim); cout << endl << "Elementos invertidos: " << endl; for (vector<int>::const_iterator fwd = teste.begin(); fwd < teste.end(); fwd++) { cout << *fwd << " "; } //replacing inicio = teste.begin(); fim = teste.end(); replace(inicio, fim, 4, -1); cout << endl << "Substituindo 4 por -1: " << endl; for (vector<int>::const_iterator fwd = teste.begin(); fwd < teste.end(); fwd++) { cout << *fwd << " "; } }

2.3.2 Classificao Alguns algoritmos de classificao:

sort(start, end): classifica em ordem crescente os elementos entre os iteradores start e end, utilizando o algoritmo introsort, sem garantia de ordem entre os elementos de mesmo valor stable_sort(start, end): semelhante a sort porm mantm a ordem original dos elementos que so iguais. sort_heap(start, end): transforma o heap entre os iteradores start e end em um heap classificado (para criar um heap a partir de um container sequencial pode-se utilizar make_heap(start, end). Exemplo:
using namespace std; #include <vector> #include <algorithm> #include <iostream> int main(int argc, char* argv[]) { int elemento; vector <int> teste; //mostrando o tamanho do container cout << "O container tem tamanho " << teste.size() << endl; //inserindo no final do container for (int i = 0; i < 10; i++) { cout << "Digite o prximo elemento: "; cin >> elemento; teste.push_back(elemento); } //percorrendo de trs para a frente cout << "Percurso do container na ordem inversa: " << endl; for (vector<int>::reverse_iterator rev = teste.rbegin(); rev < teste.rend(); rev++) { cout << *rev << " "; } cout << endl; //mostrando a capacidade cout << "A capacidade atual do vector " << teste.capacity() << endl; //criando iteradores na direo original vector<int>::iterator inicio = teste.begin(); vector<int>::iterator fim = teste.end(); //ordenando os elementos sort(inicio, fim); cout << "Elementos ordenados: " << endl;

for (vector<int>::const_iterator fwd = teste.begin(); fwd < teste.end(); fwd++) { cout << *fwd << " "; } return 0; }

2.3.3 Numricos accumulate(start, end, val): acumula e retorna o valor de val com todos os valores entre os iteradores start e end. count(start, end, val): conta quantos valores entre os iteradores start e end so iguais a val. Exemplo:
using namespace std; #include #include #include #include <vector> <algorithm> <numeric> <iostream>

void accumulate_count_test(); int main(int argc, char* argv[]) { accumulate_count_test(); } return 0;

void accumulate_count_test() { int elementos[] = {3, 8, 4, 7, 2, 1}; vector<int> teste; for (int i = 0; i < 6; i++) { teste.push_back(elementos[i]); } //accumulate the elements vector<int>::iterator inicio = teste.begin(); vector<int>::iterator fim = teste.end(); int valor = accumulate(inicio, fim, 0); cout << "Valor acumulado dos elementos: " << endl; cout << valor;

//counts the number of 7's inicio = teste.begin(); fim = teste.end(); int contagem = count(inicio, fim, 7); cout << endl << "Contagem de 7's: " << endl; cout << contagem; }

3. Adaptadores de containers
A idia dos adaptadores de containers prover funcionalidade especfica sem no entanto implementar a estrutura onde os dados so armazenados. A estrutura fornecida por um dos containers definidos na STL e o seu comportamento adaptado por um adaptador de container. So definidos 3 adaptadores na STL: stack: fornece funcionalidade de pilha (estrutura LIFO, last in first out). queue: fornece funcionalidade de fila FIFO (first in first out). priority_queue: fornece a funcionalidade de uma fila FIFO porm com prioridades de insero.

3.1 Stack
Um adaptador stack utiliza, por padro, um container deque para sua implementao. Mtodos: push: empilha pop: desempilha empty: verifica se est vazia top: obtm valor do topo da pilha

Exemplo:
using namespace std; #include #include #include #include #include <vector> <stack> <algorithm> <numeric> <iostream>

void stack_test();

int main(int argc, char* argv[]) { stack_test(); return 0; } void stack_test() { int elementos[] = {3, 8, 4, 7, 2, 1}; stack <int, vector<int> > pilha; vetor cout << "Empilhando: "; for (int i = 0; i < 6; i++) { cout << elementos[i] << " "; pilha.push(elementos[i]); } cout << endl; //desempilhamento cout << "Desempilhando: "; while (!pilha.empty()) { cout << pilha.top() << " "; pilha.pop(); } }

//monta pilha sobre

3.2 Queue
Um adaptador queue utiliza, por padro, um container deque para sua implementao. Pode tambm ser implementado com list. Mtodos: push: enfileira pop: desenfileira empty: verifica se est vazia front: obtm primeiro elemento da fila back: obtm ltimo elemento da fila

Exemplo:
using namespace std; #include #include #include #include <vector> <stack> <queue> <iostream>

void queue_test(); int main(int argc, char* argv[]) { queue_test(); return 0; } void queue_test() { int elementos[] = {3, 8, 4, 7, 2, 1}; queue <int> fila; //monta pilha sobre vetor cout << "Enfileirando: "; for (int i = 0; i < 6; i++) { cout << elementos[i] << " "; fila.push(elementos[i]); } //desenfileiramento cout << "Desenfileirando: "; while (!fila.empty()) { cout << fila.front() << " "; fila.pop(); } }

3.3 priority_queue
Um adaptador priority_queue utiliza, por padro, um container vector para sua implementao. Pode tambm ser implementado com deque. A insero feita de acordo com a prioridade dos elementos inseridos; por padro a prioridade definida pelo valor do elemento, porm pode-se fornecer um outro comparador que estenda o objeto de funo less<T> e redefina o mtodo operator() (x, y) que retorna true se x < y. Mtodos: mesmos de queue Exemplo:
using namespace std; #include <vector> #include <stack> #include <queue>

#include <iostream> #include <functional> void void void void void

//para permitir a extenso de less

rotate_reverse_replace_test(); accumulate_count_test(); stack_test(); queue_test(); priority_queue_test();

template <class T> class my_less: public less<T> { public: bool operator()(const T& x, const T& y) //redefinio do significado da comparao { if (strcmpi(x, y) < 0) return true; else return false; } }; int main(int argc, char* argv[]) { priority_queue_test(); return 0; } void priority_queue_test() { char* elementos[] = {"abacaxi" , "uva" , "mamao"}; priority_queue<char*, vector<char*>, my_less<char*> > filap; cout << "Enfileirando: "; for (int i = 0; i < 3; i++) { cout << elementos[i] << " "; filap.push(elementos[i]); } //desenfileiramento cout << endl << "Desenfileirando: "; while (!filap.empty()) { cout << filap.top() << " "; filap.pop(); } }

Você também pode gostar