UFLA

🎓 Aula 11

Redimensionamento de Vetores

Prof. Paulo Rettore

Universidade Federal de Lavras

GAC124 — Introdução aos Algoritmos

🎯 Quando o vetor enche

Um vetor dinâmico alocado com new tem capacidade fixa. Ele não aumenta no mesmo endereço.

Tamanho

Quantidade usada.

Capacidade

Quantidade que cabe.

Cheio?

É preciso criar outro vetor.

Redimensionar significa alocar uma nova região maior, copiar dados e liberar a antiga.

📦 Vetor dinâmico básico

int capacidade = 4;
int tamanho = 0;
int* v = new int[capacidade];

v[tamanho] = 10;
tamanho++;

tamanho informa quantos elementos são válidos; capacidade informa quanto espaço foi reservado.

⚠️ Por que não mudar o endereço?

Um ponteiro guarda o endereço inicial do vetor. O programa não pode simplesmente afirmar que há mais posições depois do bloco atual.

As posições seguintes podem pertencer a outro dado, ou nem estar disponíveis. Por isso, é necessário pedir um novo bloco ao sistema.

🪜 Passos do redimensionamento

  1. Calcule a nova capacidade, por exemplo o dobro.
  2. Crie um vetor temporário maior.
  3. Copie os elementos válidos.
  4. Libere o vetor antigo com delete[].
  5. Faça o ponteiro principal apontar para o novo vetor.

🔁 Copiando com um for

int novaCapacidade = capacidade * 2;
int* temp = new int[novaCapacidade];

for (int i = 0; i < tamanho; i++)
    temp[i] = v[i];

delete[] v;
v = temp;
capacidade = novaCapacidade;

Copie apenas até tamanho, porque somente essas posições possuem dados válidos.

🛠️ Usando std::copy

#include <algorithm>

int* temp = new int[novaCapacidade];
copy(v, v + tamanho, temp);

delete[] v;
v = temp;

std::copy expressa a mesma ideia: copiar o intervalo que vai de v até v + tamanho.

➕ Inserindo com aumento automático

if (tamanho == capacidade) {
    // criar temp maior, copiar e atualizar v
}

v[tamanho] = novoValor;
tamanho++;

O teste ocorre antes de inserir. Assim, sempre existe espaço na próxima posição.

🛡️ Erros comuns

Esquecer delete[]

Vaza memória.

Copiar capacidade

Pode copiar lixo em posições não usadas.

Usar ponteiro antigo

Após delete[], ele não é mais válido.

Depois de transferir o vetor novo, considere atribuir nullptr aos ponteiros que não devem mais ser usados.

🧩 Desafio: lista que cresce

Leia inteiros até receber -1. Comece com capacidade 2 e dobre a capacidade quando necessário.

  1. Guarde tamanho e capacidade.
  2. Redimensione antes de inserir quando estiver cheio.
  3. Ao final, imprima todos os valores e libere a memória.

Essa é a ideia central por trás de estruturas que crescem dinamicamente, como vetores dinâmicos de bibliotecas.

🧩 Prática em aula

Leia inteiros até -1, começando com capacidade 2, e dobre a capacidade quando o vetor estiver cheio.

Gabarito orientador: Mantenha tamanho e capacidade separados; aloque, copie, libere o vetor antigo e atualize o ponteiro.

📚 Referências e materiais

Use estas fontes para consultas pontuais depois da aula:

Os slides completos, o Campus Virtual e o DREDD continuam sendo as fontes principais da disciplina.

📈 Redimensionamento em cinco passos

Quando o vetor fica cheio, é preciso criar outro bloco, copiar os elementos e atualizar o ponteiro.

int* novo = new int[novaCapacidade];
for (int i = 0; i < tamanho; i++) novo[i] = v[i];
delete[] v;
v = novo;

🔗 Complementos online

📌 Resumo da aula

  • Vetores dinâmicos não mudam de tamanho no mesmo endereço.
  • Redimensionar significa alocar, copiar, liberar e atualizar.
  • tamanho e capacidade representam informações diferentes.
  • Vetor criado com new[] deve ser liberado com delete[].

PRÓXIMA AULA

⏭️ Próxima aula

Ordenação de vetores: métodos básicos

Prof. Paulo Rettore

GAC124 — Introdução aos Algoritmos