Templates e STL

Código genérico, escolha de contentores, iteradores, invalidação, algoritmos e comparadores.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Declarar um modelo de função

template <typename T>
T maior(T a, T b) { return a < b ? b : a; }
  • maior(3, 8) deduz int. maior(3, 2.5) não deduz um só tipo. Usa maior<double>(3, 2.5).
  • O tipo tem de oferecer as operações usadas.
  • Definições ficam no cabeçalho para a instanciação as ver.

Pilha<int> e Pilha<string> são tipos distintos. Retirar do topo exige confirmar não vazio.

Que contentor escolho?

Preciso deEscolhe
Índice constante, tamanho fixoarray<T, N>
Índice constante, crescer no fimvector<T>
Inserir nos dois extremosdeque<T>
Inserir com posição conhecidalist<T> constante; localizar o elemento custa O(n)
Chave ordenada únicaset, map; procura, inserção e remoção em O(log n) comparações
Chave sem ordem, média constanteunordered_map; média O(1) com boa distribuição das chaves e hash/igualdade de custo constante; pior caso linear
  • size() conta os elementos existentes. capacity() conta a capacidade em elementos. reserve(n) só aumenta a reserva quando n excede a capacidade atual, sem criar elementos, e nunca a diminui.
  • v[i] não verifica. at(i) verifica. front, back, pop_back exigem não vazio.
  • m[chave] insere um valor construído por omissão quando a chave falta: int fica 0, string fica vazia. find consulta sem inserir.

Iteradores sem sustos

  • [begin(), end()) inclui o início e exclui o fim. Nunca leias end().
  • vector tem acesso aleatório. list avança e recua. sort exige aleatório.
  • Realocar vector invalida todos os acessos aos elementos.
  • No vector, erase invalida os acessos da posição removida em diante. Continua com o iterador devolvido. Na list, só o elemento removido perde validade.
for (auto it = v.begin(); it != v.end(); ) {
    if (*it < 0) it = v.erase(it);
    else ++it;
}

unique não apaga sozinho

unique junta iguais adjacentes e devolve o fim do prefixo útil. O tamanho continua igual.

std::sort(v.begin(), v.end());
v.erase(std::unique(v.begin(), v.end()), v.end());
  • A cauda continua desreferenciável, com estado válido mas não especificado. O resultado lógico termina no iterador devolvido. Usa erase e não contes com esses valores.
  • Só junta adjacentes. Para todos os repetidos, ordena antes.
  • lower_bound devolve a primeira posição que não vem antes do alvo, mas exige intervalo particionado pelo mesmo comparador, normalmente ordenado. Confirma it != end() e a igualdade antes de concluir que o valor existe.
  • Comparador estrito exige comp(x, x) == false. <= não serve. Só esse teste não prova transitividade.

Agregação: resume cada chave num vetor e ordena os resumos. Média das médias pesa igual cada grupo. map<double, string> perde empatados.

Ordenação e agregação.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.