
Prof. Paulo Rettore
Universidade Federal de Lavras
GAC124 — Introdução aos Algoritmos
Um vetor dinâmico alocado com new tem capacidade fixa. Ele não aumenta no mesmo endereço.
Quantidade usada.
Quantidade que cabe.
É preciso criar outro vetor.
Redimensionar significa alocar uma nova região maior, copiar dados e liberar a antiga.
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.
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.
delete[].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.
#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.
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.
Vaza memória.
Pode copiar lixo em posições não usadas.
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.
Leia inteiros até receber -1. Comece com capacidade 2 e dobre a capacidade quando necessário.
tamanho e capacidade.Essa é a ideia central por trás de estruturas que crescem dinamicamente, como vetores dinâmicos de bibliotecas.
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.
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.
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;PRÓXIMA AULA
Prof. Paulo Rettore
GAC124 — Introdução aos Algoritmos