C++ para acompanhar os algoritmos
Vetores, referências, iteradores, comparadores e casos vazios usados nos exemplos.
Posições válidas
v{4,7,2}ocupa as posições 0, 1 e 2.size()conta elementos.capacity()conta espaço reservado.- Lê
v[i]só com0<=i<size().front(),back()epop_back()exigem vetor não vazio. reserve(10)não cria elementos.push_backcria;pop_backretira sem devolver.[l,r)temr-lposições.[1,3)lê 7 e 2.[3,3)está vazio e é válido.
Percorre para trás sem subtrair a zero sem sinal:
for (std::size_t i = v.size(); i > 0; --i)
std::cout << v[i - 1];
Cópia ou referência
| Código | O que acontece |
|---|---|
f(std::vector<int> v) | Trabalha sobre cópia |
f(std::vector<int>& v) | Altera o original |
f(const std::vector<int>& v) | Lê sem copiar |
for (int x : v) | x é cópia |
for (int& x : v) | x altera o elemento |
end()marca a posição a seguir ao último. Nunca uses*end(). No vazio,begin()==end().finddevolveend()quando falta. Num vetor,it-v.begin()dá o índice. Numa lista, esse salto não existe.sort(v.begin(),v.end())ordena tudo. Precisa de<algorithm>;vectorprecisa de<vector>.
Comparar, apontar e contar
- Lambda
[](int a,int b){return a<b;}não captura nada.[p]guarda cópia dep. Exige ordem fraca estrita;<=viola essa regra. - Só segue
p->campocompválido.nullptrmarca ausência. Depois dedelete p, o nó deixa de existir. optional<T>distingue ausência de zero. Testaif (r)antes de*r.- Inteiros truncam:
7/2vale 3.7/2*8dá 24 e7*8/2dá 28. Escreve1LL*a*bpara alargar antes de multiplicar. - Recursão suspende a chamada. Fixa caso base e medida que diminui antes de contares o custo.