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_back para adicionar os números.
  • Imprimir size() e capacity() 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

  1. Declaramos um vector vazio. Inicialmente, capacity() pode ser 0 ou 1 dependendo da implementação, mas após o primeiro push_back se torna 1.
  2. O loop de 1 a 10 insere cada número e imprime size e capacity.
  3. Quando size excede capacity, o vector realoca um bloco maior (geralmente o dobro) e move os elementos.
  4. Após o loop, usamos um for com índice e at(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 a size: 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