Médio C++
Capacidade e realocação
Enunciado
Crie um std::vector<int> e adicione 10 números sequenciais (1 a 10). A cada inserção, imprima size e capacity. No final, imprima todos os elementos usando at().
Requisitos
- Usar
push_backpara adicionar os números. - Imprimir
size()ecapacity()após cada inserção. - No final, usar
at()para acessar e imprimir os elementos.
Código inicial
#include <iostream>
#include <vector>
int main() {
// Seu código aqui
return 0;
}
Saída esperada
Size: 1, Capacity: 1
Size: 2, Capacity: 2
Size: 3, Capacity: 4
Size: 4, Capacity: 4
Size: 5, Capacity: 8
Size: 6, Capacity: 8
Size: 7, Capacity: 8
Size: 8, Capacity: 8
Size: 9, Capacity: 16
Size: 10, Capacity: 16
Elementos: 1 2 3 4 5 6 7 8 9 10
Ver dica
A capacidade cresce tipicamente dobrando quando o size ultrapassa a capacity. Use at(i) dentro de um loop para acessar os elementos.
Mostrar solução
#include <iostream>
#include <vector>
int main() {
std::vector<int> v;
for (int i = 1; i <= 10; ++i) {
v.push_back(i);
std::cout << "Size: " << v.size()
<< ", Capacity: " << v.capacity() << '\n';
}
std::cout << "Elementos: ";
for (std::size_t i = 0; i < v.size(); ++i) {
std::cout << v.at(i) << ' ';
}
std::cout << '\n';
return 0;
}
Passo a passo
- Declaramos um vector vazio. Inicialmente,
capacity()pode ser 0 ou 1 dependendo da implementação, mas após o primeiropush_backse torna 1. - O loop de 1 a 10 insere cada número e imprime
sizeecapacity. - Quando
sizeexcedecapacity, o vector realoca um bloco maior (geralmente o dobro) e move os elementos. - Após o loop, usamos um
forcom índice eat(i)para acessar cada elemento com verificação de limites.
Por que funciona
O vector gerencia um array dinâmico. size é o número de elementos válidos; capacity é o total alocado. Quando push_back precisa de mais espaço, ele aloca uma nova área, move os elementos e libera a antiga. O at(i) verifica se i < size e lança exceção se não.
Erros comuns
- Achar que
capacityé sempre igual asize: na verdade,capacity >= size. - Usar
operator[]sem verificar limites: pode causar comportamento indefinido. - Esquecer que
at()lança exceção: não capturar pode encerrar o programa.
Outra forma de resolver
Usar reserve() para evitar realocações:
v.reserve(10);
for (int i = 1; i <= 10; ++i) {
v.push_back(i);
std::cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << '\n';
}
Saída esperada
Size: 1, Capacity: 1
Size: 2, Capacity: 2
Size: 3, Capacity: 4
Size: 4, Capacity: 4
Size: 5, Capacity: 8
Size: 6, Capacity: 8
Size: 7, Capacity: 8
Size: 8, Capacity: 8
Size: 9, Capacity: 16
Size: 10, Capacity: 16
Elementos: 1 2 3 4 5 6 7 8 9 10