Cheat sheet
Tipos, passagem de argumentos, memória, cópia, objetos, STL, ficheiros e compilação.
Tipos e divisão
| Quero | Regra |
|---|---|
| Fração de inteiros | Converte antes: static_cast<double>(a) / b. a / b inteiro perde a fração |
Sinal de -7 / 2 | -3, resto -1. Trunca para zero |
Proteger soma / n | n != 0 && soma / n > 10. Com n == 0, a segunda parte não corre |
Intervalo 0 a 20 | 0 <= nota && nota <= 20. 0 <= nota <= 20 está errado |
Indefinido: divisão inteira por zero, overflow com sinal. Expressões.
Funções e arrays
| Preciso de | Usa |
|---|---|
| Ler sem copiar | const T& |
| Alterar original | T& |
| Pode faltar | T*, testa nulo |
Referência r = b | Copia valor para o referido. Não muda destino |
- Array
Ntem0aN-1. Em parâmetro vira apontador. Passa tamanho. - Descer com
size_t:for (i = size(); i > 0;) { --i; lê v[i]; }. Comsize() = 0, não entra. - Saída: devolve quantos escreveu. Chamador lê só esse prefixo.
- Letras
aaz: 26 presenças, destino 27 com\0. Conta letras, não terminador. Arrays. Filtro. Letras.
Memória
| Expressão | Significado |
|---|---|
p = &x | Guarda o endereço de x em p |
*p = 7 | Altera o objeto apontado por p |
p + i | Avança i elementos no mesmo array |
const T* p | O destino pode mudar; a leitura não altera |
T* const p | O destino não muda; a escrita altera o objeto |
[begin, end)exclui o fim. O fim marca a paragem, não se lê.- Automático morre no bloco.
new Tpededelete.new T[n]pededelete[]. - Depois de
delete, os outros acessos a esse objeto ficam pendentes. Atribuirnullptrsó limpa esse nome. - RAII:
vector,string,unique_ptrprimeiro.shared_ptrsó com partilha real. Limites. Duração. RAII.
Objetos e cópia
- Invariante primeiro. Valida antes de alterar. Classes.
T b = aconstrói.b = asubstitui existente.- Atribuição segura: prepara cópia completa, troca sem lançar, destrói antiga. Libertar primeiro perde estado. Cópia.
- Três: destrutor, cópia, atribuição. Cinco: mais dois movimentos. Zero: prefere
vector. moveapenas permite selecionar movimento. A operação escolhida é que transfere. Na biblioteca padrão, a origem continua válida sem estado prometido; tipos comounique_ptrprometem mais, e nos teus tipos vale o teu contrato. Emvectorestring, podes destruir, atribuir ou consultarsize(); o acesso a elementos continua a pedir índice válido.
Herança
- Virtual por referência ou apontador usa tipo dinâmico.
overrideconfere, incluindoconst.- Cópia para base faz slicing.
= 0é pura, classe abstrata.- Destruir por base pede destrutor virtual. Polimorfismo.
STL por decisão
| Quero | Escolhe |
|---|---|
| Índice e crescer no fim | vector |
| Chave ordenada | map, set; procura, inserção e remoção em O(log n) comparações |
| Chave sem ordem | unordered_map; média O(1) com boa distribuição das chaves e hash/igualdade de custo constante; pior caso linear |
| Remover com iterador conhecido | list constante; localizar o elemento pode custar O(n) |
reserve(n)só aumenta a reserva senexceder a capacidade atual; não cria elementos nem diminui.resizemuda o tamanho.- No
vector, realocar invalida todos os acessos aos elementos.erasenovectorinvalida os acessos da posição removida em diante. Usa o iterador devolvido. - Comparador estrito:
comp(x, x)falso.<=não serve. Só isso não prova transitividade. unique: junta adjacentes, devolve fim lógico, tamanho igual. Cauda válida sem valor prometido. Fazerasee não contes com ela. Ordena antes para todos os repetidos.remove_if: compacta por predicado. Também pedeerase.- Pesquisa:
lower_boundexige intervalo particionado pelo mesmo comparador. Confirma!= end()e a igualdade. - Consulta:
findnão insere.map[chave]insere um valor por omissão quando falta:intfica0,stringfica vazia. Contentor. Invalidação. Algoritmos.
Erros e ficheiros
- Ciclo:
while (fluxo >> valor).eof()conta passado, não prevê. - Linha:
getlinemaisistringstream. Confirma extração, sem sobra, domínio0a20. - Incompleto dá linha inválida. Vazio não dá registo. Ficheiros.
- Exceção: apanha por referência constante. Os destrutores devem libertar recursos sem deixar sair exceções; se uma exceção escapa de um destrutor chamado durante o desenrolamento, o programa termina com
std::terminate. - Básica conserva invariantes e evita fugas, sem prometer o valor. Forte não deixa efeitos observáveis.
assertdesaparece comNDEBUG. Sanitizers só veem o executado. Testes.
Build
- O cabeçalho declara a função. O
.cppdefine-a. A ligação junta os objetos. Em falta dáundefined reference. - Templates veem definição no cabeçalho. Módulos.
g++ -std=c++17 -Wall -Wextra -Wpedantic -g programa.cpp -o programa
cmake -S . -B build
cmake --build build