Guia Completo da Standard Template Library (STL) em C++

Ordenação

Por padrão, todos os elementos são ordenados em ordem crescente. Para inverter essa ordem, utiliza-se o functor greater<T>. Também é possível definir regras personalizadas de ordenação através de estruturas.

struct Comparador {
    bool operator()(const Tipo& a, const Tipo& b) const {
        // Definição da lógica de ordenação
        return a.algumCampo < b.algumCampo;
    }
};

Container Vector

O vector é um array dinâmico que oferece flexibilidade no gerenciamento de elementos.

std::vector<int> numeros;
numeros.push_back(10);    // Insere elemento no final
numeros.pop_back();       // Remove o último elemento
numeros.size();           // Retorna quantidade de elementos

// Verifica existência de elemento
bool existe = std::find(numeros.begin(), numeros.end(), valor) != numeros.end();

// Remove elemento em posição específica
numeros.erase(numeros.begin() + indice);

// Troca conteúdo entre containers
std::vector<int> outro = {1, 2, 3};
numeros.swap(outro);

Operações de Manipulação

#include <algorithm>

// Inverte a ordem dos elementos
std::reverse(numeros.begin(), numeros.end());

// Remove duplicatas (requer ordenação prévia)
std::sort(numeros.begin(), numeros.end());
numeros.erase(std::unique(numeros.begin(), numeros.end()), numeros.end());

Função sort

A função sort utiliza o padrão left-inclusive, right-exclusive:

std::sort(numeros.begin() + inicio, numeros.begin() + fim, Comparador());
// Intervalo: [inicio, fim)

Busca Binária

binary_search

bool encontrado = std::binary_search(inicio, fim, chave, Comparador());

Observações importatnes:

  • O comparator utilizado deve ser consistente com a ordenação
  • "Igual" significa que nem (a < b) nem (b < a) são verdadeiros
  • O valor encontrado pode não ser exatamente igual à chave

Lower Bound - Limite Inferior

Retorna iterador para o primeiro elemento maior ou igual à chave:

// Para container ordenado crescentemente
auto* p = std::lower_bound(arranjo + inicio, arranjo + fim, valor);

// Com comparador customizado
auto* p = std::lower_bound(inicio, fim, valor, Comparador());
// *p é o elemento com menor índice que pode ser posicionado após "valor"

Se não encontrar, retorna ponteiro para posição fim.

Upper Bound - Limite Superior

Retorna iterador para o primeiro elemento estritamente maior que a chave:

// Para container ordenado crescentemente
auto* p = std::upper_bound(arranjo + inicio, arranjo + fim, valor);

// Com comparador customizado
auto* p = std::upper_bound(inicio, fim, valor, Comparador());
// *p é o elemento com menor índice que deve estar após "valor"

Estruturas de Árvore Binária Balanceada

Multiset

Container que mantém elementos ordenados,允许 elementos duplicados. Complexidade: O(log n).

std::multiset<int> conjunto;

// Inserção
conjunto.insert(42);

// Busca - retorna iterador ou end() se não encontrar
auto it = conjunto.find(42);

// Remoção
conjunto.erase(it);           // Remove elemento específico
conjunto.erase(42);           // Remove todas ocorrências

// Contagem
int qtd = conjunto.count(42);

// Tamanho
size_t total = conjunto.size();

Iteradores

std::multiset<int>::iterator iterador;

iterador = conjunto.begin();  // Primeiro elemento
iterador = conjunto.end();    // Após o último

// Operações válidas: ++, --, ==, !=
// Operações inválidas: <, >, +, -, subtração entre iteradores

Métodos de Busca

// Lower bound: primeiro elemento maior que chave
auto it1 = conjunto.lower_bound(chave);

// Upper bound: primeiro elemento maior ou igual que chave
auto it2 = conjunto.upper_bound(chave);

Set

Similar ao multiset, mas não permite elementos duplicados.

std::set<int> conjuntoUnico;

// Retorna pair<iterador, bool>
auto resultado = conjuntoUnico.insert(42);

if (!resultado.second) {
    // Inserção falhou - elemento já existe
}

Multimap

Container associativo que aramzena pares (chave, valor), permitindo chaves duplicadas.

typedef std::multimap<std::string, int> MapaMulti;

// Inserção
mapa.insert(std::make_pair("chave", valor));

Os elementos são ordenados pela chave (first) utilizando first < first.

Map

Container associativo com chaves únicas e acesso direto por índice.

std::map<std::string, int> dicionario;

// Inserção/atualização via operador []
dicionario["palavra"] = 42;

// Acesso ao valor
int valor = dicionario["palavra"];

O operador [] retorna a referência ao valor (second) correspondente à chave.

Tags: C++ STL Standard Template Library Container vector

Publicado em 8-30 15:41